C++ 复制构造函数,谁能解释为什么?

C++ copy constructor, can anyone explain why?

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 的输出仍然是 "cde"?谢谢。

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

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

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

strcpy(s,c.s);

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

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

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

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

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

阅读更多What is The Rule of Three?