在c++赋值运算符函数的学习中,对于返回值类型的问题,一直非常费解,今天彻底总结一些每种不同返回值类型的结果:
1、当返回值为空时:
<span style="font-size:14px;">void hasptr::operator=(const hasptr& s)</span>
这个时候如果只有一个‘=’(a = b)运算那就没问题,但是如果存在‘=’(a = b = c)的链式操作时,编译器就会报错
我们看:a = b = c;
程序会先运行 b = c;
因为函数的返回值为viod , 所以 b = c这个操作就会返回一个NULL
那么这是 a = (b = c) 也就是 a = NULL , 这种操作时不存在的 , 即使是存在也不符合我们对这个操作的初衷。
2、当返回值是 类本身时:
<span style="font-size:14px;">hasptr hasptr::operator=(const hasptr& s)</span>
支持‘=’的链式操作
如果返回值是类本身 , 那么这个函数运行的过程是:
1、进入函数内部,运行函数内部的操作
2、函数内部的操作运行完之后,调用类的拷贝构造函数,把对象拷贝给一个新的对象
3、返回那个新建立的对象
这里是关键是,每运行一次赋值运算符函数,就要调用一次拷贝构造函数,这样不仅会浪费时间。
如果类中没拷贝构造函数,有时候还会出错。
3、当返回值是引用时
<span style="font-size:14px;">hasptr &hasptr::operator=(const hasptr& s)</span>
这种方式是最好的 , 即支持链式操作,还把操作时间降到了最低
完整代码:
<span style="font-size:14px;">hasptr &hasptr::operator=(const hasptr& s) { i = s.i; string *x = new string(*s.ps); delete ps; ps = x; return *this; }</span>
赋值运算符函数的返回值类型详解,布布扣,bubuko.com
原文地址:http://blog.csdn.net/zengchen__acmer/article/details/38351385