在讲解这个概念之前我先明确一下这边文章中的几个基本概念;当时写文章时因为这几个概念混淆了,导致大部分内容重写。
复制构造函数及调用复制构造函数的三种情况:
class A{ int x; public: A(int a):x(a) { }//构造函数 A(const A& a1) { }//复制构造函数 }; A Func(A a2) { }//1、类的对象作为形参,调用复制构造函数 A Func1() {A a3(4);return a3;}//2、类的对象作为函数的返回值,调用复制构造函数 int main(){ A a(1),a1(a);//3、用类的对象a初始化类的另一个对象a1,调用类的复制构造函数 }
浅拷贝(浅复制):将对象a内存中的数据按照二进制位(Bit)复制到对象b所在的内存(a和b指向同一内存空间)
深拷贝(深复制):将对象a的所有成员变量拷贝给新对象b,并为对象b分配一块新的内存,并将原有对象所持有的内存也拷贝过来(a和b指向不同内存空间)
运算符”=“如果没有被重载,默认执行的是浅拷贝;如果要让运算符”=“执行深拷贝,需要自己重载运算符。
重载“=”运算符
标准格式
class A{
public:
A & operator = (line & b);
//返回值时引用,与类的复制(拷贝)构造函数有关
};
返回值为空类型
class A{
public:
void operator = (line & b);
//返回值为void类型
//当使用两个或两个以上“=”时,有时会类型不符
};
对象间的连续赋值
A a, b, c;
a=b=c;
//a=b=c等价于a=(b=c);
为了实现连等,要将返回值定义为该类的类型。
当执行到retur