什么时候赋值运算符符号被调用?
一个已经被初始化的实例从另一个实例中被赋予初值的时候,赋值运算符函数被调用(注意其和拷贝构造函数的区别)
Test T1, T2;
T2 = T1; //assignment operator called
什么时候我们应该写我们自己的赋值运算符函数?
一般来说,如果class中不包含指针,我们就没有必要单独写自己的赋值运算符函数,因为编译器会为每个class创建一个默认的赋值运算符函数,但是如果我们的类中存在指针或者运行中的资源分配,编译器默认的赋值运算符函数就不够用了。因为如果包含指针的话,通过系统默认赋值,两个实例的指针会 指向同一片内存区域,导致出现问题。
我们写赋值运算符函数的时候要注意什么?
1. 返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用 *this,否则不能连续赋值(T1=T2=T3)
2. 传入的参数声明为常量引用。如果不是引用,在传参的过程中会调用复制构造函数;如果不是常量,则会在函数里改变传入实例的状态。
3. 在分配新内存之前应该先释放实例自身的内存,否则会出现内存泄漏(动态分配的内存没有被及时回收,也不能再被利用)
4. 判断传入的参数和当前的实例(*this)是不是同一个,如果是同一个实例,那么在释放本实例内存的时候,传入的实例内存也被释放了
经典解法:
<