拷贝构造函数默认的是浅拷贝。当不涉及到堆内存时用浅拷贝完全可以,否则就需要深拷贝了。

浅拷贝相当于一个箱子有多个钥匙,但其中一个人打开箱子取走箱子里的东西时,其他人是不知道的。

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

运行结果如下:
图片说明