【06】深拷贝和浅拷贝,空类默认成员
版权声明:zhuhurry 未经博主允许不得转载 https://blog.****.net/zhuhurry
一、深拷贝和浅拷贝
深拷贝:当对象中含有指针的时,在进行调用复制构造函数、或者=操作的时候,将指针指向的内存空间也进行了拷贝,这种行为成为深拷贝。
浅拷贝:当对象中含有指针的时,在进行调用复制构造函数、或者=操作的时候,单纯的拷贝了指针的值(两个对象的指针指向同一块内存),这种行为称为浅拷贝。此时在对象生存周期结束,调用析构函数销毁这个指针时会出现段错误。
而C++默认提供的复制构造函数和=号操作符都是浅拷贝操作,即只是将指针进行值复制,还要注意复制构造函数和=操作符的区别:
1 ClassA a(10);
2 ClassA b(a); //此时调用复制构造函数,没有调用等号操作符
3 ClassA b = a; //此时调用复制构造函数,没有调用等号操作符
4 ClassA c(14);
5 c = a; //此时调用的时等号操作符
区分它们的方法是,看左边对象是否已经实例化,上面第3、4句话b都没被实例化需要构造函数进行实例化,而这个构造函数正是复制构造函数。而第5句c已经实例化,固调用的是=号操作符。
为了解决浅拷贝之后出现的段错误问题,错误现象如上所示,我们重写复制构造函数和=号操作符,使之完成深拷贝。修改之后如下所示,这样就不会出现上面的段错误问题。
二、空类默认成员
一个空类class ClassA{};默认会产生如下成员:我们可以重写的默认的函数
ClassA(); // 默认构造函数
ClassA( const ClassA& ); // 默认拷贝构造函数
~ClassA(); // 默认析构函数
ClassA& operator=( const ClassA& ); // 默认赋值运算符
ClassA* operator&(); // 取址运算符
const ClassA* operator&() const; // 取址运算符 const