拷贝构造和拷贝赋值
浅拷贝和深拷贝
浅拷贝:数据共享double free
概念 如果类中包含了指针形式的成员变量,缺省的拷贝构造函数只是复制了指针本身,没有复制指针所指向的内存中的实际位置,这种拷贝方式被称为浅拷贝
缺省到的拷贝是浅拷贝(拷贝的是地址编号)
浅拷贝问题 浅拷贝
将导致不同的对象之间的数据共享,两个对象中的指针指向同一个内存空间,当在析构过程中 会引发double free
(即对同一个对象进行多次释放),从而导致进程异常终止
深拷贝:拷贝指针所指向的实际内容
概念 为了避免数据共享的问题,以及double free
问题,因此就必须自己定义一个支持复制指针所指向的内存的实际内容的拷贝构造函数,即深拷贝
自定义拷贝构造函数要设置成深拷贝
深拷贝的本质 深拷贝本质就是如果类中有指针形式的成员变量
,将会拷贝指针所指向的实际内存中的内容
拷贝赋值
当两个自定义类型对象进行赋值运算时,比如i3=i2
,编译器会将其处理为i3.opreator=(i2);
这样的成员函数的调用形式,由拷贝赋值操作符函数进行赋值运算,其返回结果就是赋值表达式的结果 如果自己没有定义拷贝赋值函数,编译器会自动为该类提供一个缺省的拷贝赋值函数,但是缺省的拷贝赋值函数和缺缺省的拷贝构造函数类似为浅拷贝,存在double free
和数据共享问题,因此为了得到深拷贝效果,避免浅拷贝问题,需要自己定义深拷贝赋值函数
class A {
public :
A ( int a = 10 ) : m_a ( a) { }
private :
int m_a;
} ;
A a1;
A a2 = a1;
A a3;
a3 = a1;
a3 operator = ( a1) ;
类名& operator = ( const 类名& that) {
cout<< "自定义拷贝赋值" << endl;
if ( & that != this ) {
* 成员变量 = * that. 成员变量;
}
return * this ;
}
类名& operator = ( const 类名& that) {
cout<< "自定义拷贝赋值" << endl;
if ( & that != this ) {
delete 成员变量;
成员变量指针 = new 新变量;
* 成员变量 = * that. 成员变量;
}
return * this ;
}