Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Copy Constructor 
V
    Опции темы
yngwie19
Дата 27.10.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Привет всем есть вопрос по Copy Constructor. Допустим есть собственный класс String
Код

#include <iostream>
using namespace std;

class String
{
    friend ostream& operator<<(ostream&, String&);
    public:
        String(char* = "");
        String(String&);
        ~String();
        String operator+(String&);
        String& operator=(String&);
    private:
        char* ptr;
        int length;
};
int main()
{
   s1 = ("Hello "), s2 = ("World!"), s3;
  cout<<"s1 = "<<s1<<endl;
  cout<<"s2 = "<<s2<<endl;
  s3 = s1+s2;
  cout<<"s3 = s1 + s2 = "<<s3<<endl;
  
    return 0;
}

String::String(char* s) // Constructor
{
    length = strlen(s);
    ptr = new char[length+1];
    strcpy(ptr,s);
}
String::String(String& s)  //Copy Constructor
{
    length = s.length;
    ptr = new char[length+1];
    strcpy(ptr,s.ptr);
}
String::~String()  // Destructor
{
    delete []ptr;
}
ostream& operator<<(ostream& out, String& s)
{
    out<<s.ptr;
    return out;
}
String String::operator+(String& s)
{
    String s3;
    delete s3.ptr;

    s3.length = length + s.length;
    s3.ptr = new char[s3.length+1];
    strcpy(s3.ptr,ptr);
    strcat(s3.ptr,s.ptr);

    return s3;
}
String& String::operator =(String& s)
{
    if(this == &s)
        return *this;
    else
        delete ptr;
    length = s.length;
    ptr = new char[length+1];
    strcpy(ptr,s.ptr);

    return *this;
}

Вопрос:
Почему в Copy Constructore не нужно удалять нулевой симол "\0", создаваемый при инициализации объекта, в данном случае временного,(т.к мы возвращаем из String String::operator+(String& s) сопию s3) а сразу выделять для этого времнного объекта динамическую память?

Это сообщение отредактировал(а) yngwie19 - 27.10.2008, 23:11
PM MAIL   Вверх
eyeofhell
Дата 27.10.2008, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Адепт
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 16.10.2008
Где: Россия, Москва

Репутация: 1
Всего: 1



Цитата

Почему в Copy Constructore не нужно удалять нулевой симол "\0", создаваемый при инициализации объекта, в данном случае временного,(т.к мы возвращаем из String String::operator+(String& s) сопию s3) а сразу выделять для этого времнного объекта динамическую память?


Уточните где имнно объект временный - в copy constructor или operator+ ? Это же разные функции.
PM MAIL ICQ   Вверх
yngwie19
Дата 27.10.2008, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



eyeofhell,  в стоке 59 мы возвращаем копию локалного объета s3, тем самым  main генерируется Конструктор копии. 
PM MAIL   Вверх
eyeofhell
Дата 28.10.2008, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Адепт
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 16.10.2008
Где: Россия, Москва

Репутация: 1
Всего: 1



Цитата

Почему в Copy Constructore не нужно удалять нулевой симол "\0" а сразу выделять для этого времнного объекта динамическую память?


Вопрос очень странный. Сперва про нулевой символ который зачем-то удалять, а потому сразу про этот временный объект. Что тут объекто-то? Нулевой символ? Он нифига не объект, он байт в строке.

Конструктор копирования создает новый объект из существующего. Кроме случаев с '+', может быть использован например вот так:

Код

String s1 = "oops";
String s2( s1 );


Ноль в конец строки дописыают всегда чтобы можно было на эту строку вернуть указатель. Функции CRT, которые работаю с указателями на строку ( например, printf() ), по этому нулю длину строки определяют. Для них нет поля length класса String, им только указатель дают.

Что происходит в s3 = s1 + s2:

1) выполняется s1.operator+( s2 ), который внутри себя создает на стеке новую строку s3(temp).
2) s1.operator+( s2 ) делает return s3(temp). При этом создается временная строка для которой вызывается конструктор копирования ( s3(temp) ).
3) s1.operator+( s2 ) выходит, созданная на стеке s3(temp) автоматически разрушается.
4) выполняется s3.operator=( временная строка )
5) программа завершает выполнение строки кода s3 = s1 + s2, временная строка автоматически разрушается.


Это сообщение отредактировал(а) eyeofhell - 28.10.2008, 00:05
PM MAIL ICQ   Вверх
J0ker
Дата 28.10.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Код

class String
{
    friend ostream& operator<<(ostream&, const String&);
    public:
        String(const char* = "");
        String(const String&);
        ~String();
        String operator+(const String&) const;
        String& operator=(const String&);
    private:
        char* ptr;
        int length;
};

а вопрос не понят даже с пояснением


--------------------
user posted image
PM MAIL   Вверх
yngwie19
Дата 28.10.2008, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Ой ребят извените Я разобрался сам. Ну да немножко не понятно написал smile  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1718 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.