C ++拷贝构造函数,谁能解释为什么?

时间:2017-02-05 09:13:39

标签: c++ pointers constructor deep-copy shallow-copy

using namespace std;

class C {

public:

    char *s;

    C(const char *s0) {
        s = new char[strlen(s0)+1];
        strcpy(s,s0);
    }

    C(C &c) {
        s = new char[strlen(c.s)+1];
        strcpy(s,c.s);
    }
};

int main(int argc, char* argv[]) {

    C c("cde");
    C c0(c);

    cout << c.s << endl;
    cout << c0.s << endl;

    c.s[1] = 'X';

    cout << c.s << endl;
    cout << c0.s << endl;
}

我不太确定指针和引用发生了什么。任何人都可以解释为什么第二个c0.s的输出仍然是&#34; cde&#34;?谢谢。

1 个答案:

答案 0 :(得分:2)

复制构造函数正在创建一个新缓冲区

s = new char[strlen(c.s)+1];

并将原始缓冲区的内容复制到新缓冲区

strcpy(s,c.s);

因此两个对象都包含单独的缓冲区。修改一个对象会修改该对象的缓冲区,因此不会有任何修改渗透到另一个对象。

如果复制构造函数看起来像这样

C(C &c) {
    s = c.s;
}

复制默认的复制行为,两个对象都会引用同一个缓冲区,而另一个对象的更改会出现在另一个缓冲区中。

如果已经实现了析构函数来删除缓冲区并防止分配给缓冲区的存储泄漏,那么这将是致命的。销毁一个对象会释放两个缓冲区,迟早会访问或删除无效缓冲区。

更多阅读What is The Rule of Three?