赋值运算符的重载函数基本可以确定为两种写法,一种是初级程序员的写法,另外一种是高级程序员的写法,下面将对赋值运算符的重载函数的两种形式进行解析。
1、初级程序员的写法
注意: 此写法存在问题,即 _ptr = new char[strlen(src._ptr)+1];存在问题。问题在于当考虑异常安全性的时候,之前的delete释放了_ptr的内存,若此时的内部不足导致申请内存失败抛出异常,strcpy_s的时候就会导致程序崩溃。
2、高级程序员的写法
此代码则很好的解决了上边的问题,在上边的代码片中,我先创建了一个tmp的Test类的临时对象,然后通过ptmp指针将tmp._ptr和(*this)._ptr的指向交换,这样当整个函数指向完后局部对象自动析构,这样就能析构调用operator=()函数的对象的原有的内存,不会产生内存丢失,同时解决了异常安全性的问题。Test的拷贝构造函数里调用new分配内存,如果由于内存不足抛出异常,则还没有修改实例((*this)._ptr)的状态,因此实例的状态还是有效的。
另外,关于赋值运算符的重载函数的返回值为什么是 Test&、形参为什么要加const、形参为什么用引用?这些问题就不再过多陈述,有问题可参考: http://www.cnblogs.com/zpcdbky/p/5027481.html