Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Copy Constructor


Автор: yngwie19 27.10.2008, 23:10
Привет всем есть вопрос по 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) а сразу выделять для этого времнного объекта динамическую память?

Автор: eyeofhell 27.10.2008, 23:31
Цитата

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


Уточните где имнно объект временный - в copy constructor или operator+ ? Это же разные функции.

Автор: yngwie19 27.10.2008, 23:34
eyeofhell,  в стоке 59 мы возвращаем копию локалного объета s3, тем самым  main генерируется Конструктор копии. 

Автор: eyeofhell 28.10.2008, 00:04
Цитата

Почему в 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, временная строка автоматически разрушается.

Автор: J0ker 28.10.2008, 00:05
Код

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;
};

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

Автор: yngwie19 28.10.2008, 00:36
Ой ребят извените Я разобрался сам. Ну да немножко не понятно написал smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)