1. 浅拷贝的例子
#include <iostream>
#include <cstring>
class ShallowCopyExample
{
public:
// 构造函数
ShallowCopyExample(const char* str)
{
data = new char[strlen(str) + 1];
strcpy(data, str);
}
// 拷贝构造函数(浅拷贝)
ShallowCopyExample(const ShallowCopyExample &source)
{
data = source.data; // 浅拷贝
}
// 析构函数
~ShallowCopyExample()
{
delete data;
}
// 打印数据
void printData() const
{
std::cout << "Data: " << data << std::endl;
}
private:
char* data;
};
int main()
{
ShallowCopyExample obj1("Hello");
ShallowCopyExample obj2 = obj1; // 调用拷贝构造函数(浅拷贝)
obj1.printData();
obj2.printData();
return 0;
}
这个例子中,ShallowCopyExample
类使用了浅拷贝。拷贝构造函数只是简单地将指针 data
的值(即地址)从源对象复制到目标对象,导致两个对象指向同一块内存。因此,当一个对象的析构函数释放内存时,另一个对象的指针就变成了悬空指针。在你执行上述代码时会报错Unknown signal的原因是obj1和obj2的数据是同一处内存里的数据,也就是说,调用了obj1的析构函数删除“data”再调用obj2析构函数,此时“data”已经不存在了,所以显示未知信号 Unknown signal
2. 深拷贝的例子
#include <iostream>
#include <cstring>
class DeepCopyExample
{
public:
// 构造函数
DeepCopyExample(const char* str)
{
data = new char[strlen(str) + 1];
strcpy(data, str);
}
// 拷贝构造函数(深拷贝)
DeepCopyExample(const DeepCopyExample &source)
{
data = new char[strlen(source.data) + 1];
strcpy(data, source.data);
}
// 析构函数
~DeepCopyExample()
{
delete data;
}
// 打印数据
void printData() const
{
std::cout << "Data: " << data << std::endl;
}
private:
char* data;
};
int main()
{
DeepCopyExample obj1("Hello");
DeepCopyExample obj2 = obj1; // 调用拷贝构造函数(深拷贝)
obj1.printData();
obj2.printData();
return 0;
}
在这个例子中,DeepCopyExample
类使用了深拷贝。拷贝构造函数创建了一个新的动态分配的内存,将源对象的数据复制到新的内存中。这确保了每个对象都有自己的内存副本,防止了悬空指针的问题。
3.写法区别
data = source.data; // 浅拷贝 指针指向
-------------------------------------------------------------------------------------
data = new char[strlen(source.data) + 1]; //深拷贝 申请空间给值
strcpy(data, source.data); //里面是指针
4.调用方式
第二行和第三行都可以调用拷贝构造函数。
运行结果: