不使用复制构造函数

时间:2015-05-21 07:14:15

标签: c++ copy-constructor

class String
{
private:
    char *s;
    int size;
public:
   String(const char *str = NULL); // constructor
    ~String() { delete [] s;  }// destructor
    //String(const String&); // copy constructor --> i get double free error while running without this
    void print() { cout << s << endl; } // Function to print string
    void change(const char *);  // Function to change
};

String::String(const char *str)
{
    size = strlen(str);
    s = new char[size+1];
    strcpy(s, str);
}

void String::change(const char *str)
{
    delete [] s;
    size = strlen(str);
    s = new char[size+1];
    strcpy(s, str);
}

/*String::String(const String& old_str)
{
    size = old_str.size;
    s = new char[size+1];
    strcpy(s, old_str.s);
}*/

int main()
{
    String str1("Hello");
    String str2 = str1;

    str1.print(); // printed 
    str2.print();

    str2.change("Helloworld");

    str1.print(); // not printed
    str2.print();// printed

    return 0;
}

http://ideone.com/xJtoTf

我收到双重免费错误,第二次没有打印str1的打印件(请参阅上面代码中的评论)...

是不是因为我在这里没有使用复制构造函数,而是使用了调用默认复制构造函数的赋值运算符,并且str2str1都指向同一位置?

1 个答案:

答案 0 :(得分:3)

String str2 = str1;调用复制构造函数,而不是赋值运算符。

由于您没有提供复制构造函数,编译器将自动提供一个。所有这一切都是复制会员数据。

因此str2str1都将共享相同的字符缓冲区。吊杆!