拷贝构造函数默认的是浅拷贝。当不涉及到堆内存时用浅拷贝完全可以,否则就需要深拷贝了。
浅拷贝相当于一个箱子有多个钥匙,但其中一个人打开箱子取走箱子里的东西时,其他人是不知道的。
#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; }
运行结果如下: