为什么要在operator=中返回*this的引用

2016-01-29 12:19 32 1 收藏

为什么要在operator=中返回*this的引用,为什么要在operator=中返回*this的引用

【 tulaoshi.com - C语言心得技巧 】

为什么要在operator=中返回"*this"的引用
作者:康建东

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

下载本文示例代码

[问题的提出]:
在很多书籍和文章中,很多次提到在对赋值操作符(=)进行重载的时候,要返回对目的(调用)对象实例(*this)的引用。其中不免有这样的论断:一定要返回对调用对象的引用;返回对调用实例对象的引用是为了实现链式连续赋值。
这里说明两个问题:第一,是否重载赋值操作符必须返回对调用对象的引用,第二,是否这样就可以实现链式赋值,而不这样就不行。
首先,必须承认,返回对"*this"的引用是标准的二目操作符重载的格式,效率很高。这样做有很多优点:如实现链式赋值、避免临时对象的产生(调用拷贝构造函数)、销毁(调用析构函数),但不是非这样做不可,下面通过对比来论述返回对"*this"的引用的优点及其他做法的缺点,同时也能清楚第二个问题,我们从例子着手。

// a.hclass A  {public:A();A(int nTest);A(const A& a);virtual ~A();A operator=(const A& a);// A& operator=(const A& a);private:int m_nTest;public:void printit();};}// a.cppA::A(int nTest){m_nTest = nTest;cout << "constructor A Value is executed now!" << endl;}A::A(const A& a){this->m_nTest = a.m_nTest;cout << "Copy constructor A is executed now!" << endl;}A::A(){cout << "constructor A Default is executed now!" << endl;}A::~A(){cout << "Destructor A is executed now!" << endl;}A A::operator=(const A& a)// A& A::operator=(const A& a){if (this==&a)  return *this;this->m_nTest = a.m_nTest;cout << "Assignment A is  executed now!" << endl;return *this;}
在main()函数中调用
A a(100),b(99),c(98);a = b = c;a.printit();b.printit();c.printit();
结果为:
constructor A Value is executed now!
constructor A Value is executed now!
constructor A Value is executed now!
Assignment A is executed now!
Copy constructor A is executed now!
Assignment A is executed now!
Copy constructor A is executed now!
Destructor A is executed now!
Destructor A is executed now!
99
99
98
Destructor A is executed now!
Destructor A is executed now!
Destructor A is executed now!

如果将 A operator=(const A& a) 改为 A& operator=(const A& a)
则结果为:
constructor A Value is executed now!
constructor A Value is executed now!
constructor A Value is executed now!
Assignment A is executed now!
Assignment A is executed now!
98
98
98
Destructor A is executed now!
Destructor A is executed now!
Destructor A is executed now!

两者的不同为前者比后者多执行了两次构造(拷贝构造函数)和析构函数,可见在执行过程充产生了两个临时对象。

[1]在赋值函数为:A operator=(const A& a)的情况下
对于a=b=c; 实际为a.operator=(b.operator=(c))
在执行A operator=(const A& a) 后返回 *this 给一个临时对象,所以生成和销毁这个临时对象的时候分别要调用构造和析构函数,而构造时是用一个已经存在的实例出初始化同类型的实例,所以调用的拷贝初始化函数。析构时,先析构前面一个(a.operator=)产生的临时对象,后析构"b.operator="产生的临时对象.

[2] 在赋值函数为:A& operator=(const A& a)的情况下
不同的是没有临时对象的产生,因为operator=返回的是对当前对象的引用,而引用只是别名,而不是构造新

来源:http://www.tulaoshi.com/n/20160129/1485592.html

延伸阅读
标签: ASP
  If you store an array in a Session object, you should not attempt to alter the elements of the stored array directly. For example, the following script will not work: <% Session("StoredArray")(3) = "new value" % This is because the Session object is implemented as a collection. The arra...
标签: excel
excel中绝对引用,相对引用,与快捷键相对引用图文教程   我们在用excel处理数据的过程中,经常要用到拖拽单元格以进行公式复制,引用的数据是已有单元格中的数据,我们可能需要: 1)绝对引用,就是指引用某一单元格的数值,不随着拖拽而变成引用了其他数值 2)也可能需要相对引用,只引用行数据或列数据 3)还有这几种...
问题: 如何知道引用的相对应的名称? 我想引用在引用对话框没有的引用,但又不知道它的名称,不知有什么帮助呢? 如:microsoft Office 10.0 Object Library在对话框没有,那要浏览它,请问它相对应的名称是什么呢? 还有如果看到别的人数据库有些引用,而在我的数据库的引用对话框上找不到的呢?  回答: 用以下代码显示出现在已经引用的所有...
标签: excel
Excel中的7种返回错误值各提示什么?   Excel 中的7 种错误: 错误值发生原因 #DIV/0! :当数字除以 0 时,出现该错误。 #NUM! : 如果公式或函数中使用了无效的数值,出现该错误。 #VALU:E! 当在公式或函数中使用的参数或操作数类型错误时,出现该错误无效时,出现该错误。 #NULL! :如果指定两个并不...
标签: word
Word中玩转交叉引用的技巧   Word中的交叉引用,很多的朋友都不知道,这是做什么的用的吧,其实一两句话也说不清。我们通过一个例子来理解一下,感兴趣的用户可以跟着来: 例如本文中,将光标放在如字后面,依次点击菜单栏的插入-引用-交叉引用,打开交叉引用设置对话框。 使用交叉引用的好处在于,当在文中插入新的图片后...

经验教程

808

收藏

96
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部