拷贝构造函数默认的是浅拷贝。当不涉及到堆内存时用浅拷贝完全可以,否则就需要深拷贝了。
浅拷贝相当于一个箱子有多个钥匙,但其中一个人打开箱子取走箱子里的东西时,其他人是不知道的。
#include <bits/stdc++.h>
using namespace std;
class A{
public:
    A() {
        cnt1++;
        name = new char(20);
        strcpy(name, "hello");
        cout << "A" << name << endl;
    }
    ~A() {
        cnt2++;
        cout << "~A" << name << endl;
        delete name;
        name = nullptr;
    }
    char *name;
    static int cnt1;
    static int cnt2;
};
int A::cnt1 = 0;
int A::cnt2 = 0;
int main() {
    {
        A a;
        A b(a);
    }
    cout << A::cnt1 << ' ' << A::cnt2 << endl;
    return 0;
}运行结果如下: 
很明显对象b的name是一个空指针了,如果对空指针进行操作的话就会出现问题了。
所以涉及到堆内存时就需要自己实现拷贝构造函数了。
#include <bits/stdc++.h>
using namespace std;
class A{
public:
    A() {
        cnt1++;
        name = new char(20);
        memmove(name, "hello", strlen("hello"));
        cout << "A" << name << endl;
    }
    A(const A&b) {
        name = new char(strlen(b.name)+1);
        memmove(name, b.name, strlen(b.name));
    }
    ~A() {
        cnt2++;
        cout << "~A" << name << endl;
        delete name;
        name = nullptr;
    }
    char *name;
    static int cnt1;
    static int cnt2;
};
int A::cnt1 = 0;
int A::cnt2 = 0;
int main() {
    {
        A a;
        A b(a);
    }
    return 0;
} 运行结果如下: 



 京公网安备 11010502036488号
京公网安备 11010502036488号