大量文本警告!!!干货警告!!!我崩溃了一下午的收获.../心累
拷贝构造函数和赋值运算符
·在默认情况下(用户没有定义,但是也没有显式的删除),编译器会自动的隐式生成一个拷贝构造函数和赋值运算符。
·系统内置的拷贝构造函数和赋值运算符缺陷:(-》重载“=”问题:为何有指针成员时一定要重载?)(浅拷贝与深拷贝 见附录1)
当存在指针成员时,进行拷贝构造操作时,会使两个对象的指针成员指向同一处空间(new 出来的空间),析构时会对同一处空间进行释放两次。
当存在指针成员时,进行对象赋值运算,相当于将右值完全不变地赋值给左值,这时不仅使两个对象的指针成员指向同一处空间,析构时会对同一处空间进行析构两次;同时左值原来的指针成员指向的空间(new 出来的空间)也没有被释放,会出现内存泄漏问题!
·补充一个:为什么建议拷贝构造函数的参数是const Class& c;
先说为什么是引用,拷贝构造函数就是用来复制对象的,在使用这个对象的实例来初始化这个对象的一个新的实例。如果参数采用的是值传递方法,那么必然涉及将实参传递给形参,需要对形参进行拷贝构造,而我们正在编写拷贝构造,这样不就矛盾了吗。
在说为什么写const,因为一些函数会返回对象类型,这些临时对象默认是const Class型的,如果实现像Class c3=c1+c2;(假设c1,c2是定义好的Class类对象,+已经重载,返回值为Class类型),就会将c1+c2返回的临时对象(const Class型)拷贝给c3,如果拷贝构造函数形参是Class& 型,就会将const Class型赋给Class&型,这样显然是错误的。
-》》》再谈赋值运算符
好了,说过一些浅层次的赋值运算符重载的应用问题了,再谈谈深层次的。
一、为什么函数的形参要是const Class&
一般地,赋值运算符重载函数的参数是函数所在类的const类型的引用(如上面例1),加const是因为:
①我们不希望在这个函数中对用来进行赋值的“原版”做任何修改。
②加上const,对于const的和非const的实参,函数就能接受;如果不加,就只能接受非const的实参。
③个人感觉这是关键:因为进行赋值运算时会很容易出现将一个临时对象赋值给对象的状况,例如c3=c1+c2;,因为临时对象是const型,所以形参一定要是const型才能接受实参。
用引用是因为:
这样可以避免在函数调用时对实参的一次拷贝,提高了效率。
二、重载函数的返回值类型是不是引用与链式运算没有关系!</