一、对深拷贝以及浅拷贝的理解
深拷贝是把内容等直接都复制过来了,就比如对象这种浅拷贝只是复制了地址,而深拷贝则需要重新new一个对象将其结果复制过来,而这种深拷贝在有堆,文件,系统资源这些的时候,都需要进行这样的操作。
之所以要进行这样的操作是因为:
- 当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,而导致指针悬挂现象
二、c++中类的拷贝构造函数、重载运算符以及析构函数
使用了拷贝构造函数:
- C++ 中的拷贝构造函数只拷贝指针的值,就是浅拷贝,我们手动在拷贝构造函数中为指令创建新的动态内存地址,再拷贝值,就是深拷贝
class A
{
public:
A(int _size) : size(_size)
{
data = new int[size];
} // 假如其中有一段动态分配的内存
A(const A& a){
this->data=new int[a.size];
for(int i=0;i<a.size;++i){
this->data[i]=a.data[i];
}
}
A& operator=(const A &a){
//实现重载运算符
if(this!=&a){
// this->data=a.data;
//申请空间并拷贝内容
this->data=new int[a.size];
for(int i=0;i<a.size;++i){
this->data[i]=a.data[i];
}
}
}
~A()
{
delete [] data;
} // 析构时释放资源
//打印变量值
void print(){
for(int i=0;i<size;++i){
std::cout<<data[i]<<std::endl;
}
}
private:
int* data;
int size;
};
int main()
{
A a(5), b = a;
a.print();
}
实现效果: