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