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

水萋莞

水萋莞

2016-01-29 12:19

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

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

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

下载本文示例代码

[问题的提出]:
在很多书籍和文章中,很多次提到在对赋值操作符(=)进行重载的时候,要返回对目的(调用)对象实例(*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=返回的是对当前对象的引用,而引用只是别名,而不是构造新

展开更多 50%)
分享

猜你喜欢

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

C语言教程 C语言函数
为什么要在operator=中返回*this的引用

为什么operator=操作符返回引用

C语言教程 C语言函数
为什么operator=操作符返回引用

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

C++箴言:必须返回对象时别返回引用

编程语言 网络编程
C++箴言:必须返回对象时别返回引用

为什么十二星座要在爱情里委曲求全

十二星座 星座 星座运势
为什么十二星座要在爱情里委曲求全

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

生肉为什么不要在水龙头下冲洗

生活常识
生肉为什么不要在水龙头下冲洗

隐睾症为什么要在2岁以前手术治疗

育儿 育儿知识 妈妈 儿歌 取名 婴儿 喂养 孕期 营养 怀孕 分娩 孕妇 教育 胎教 亲子游戏 奶粉 幼儿 宝宝 早教
隐睾症为什么要在2岁以前手术治疗

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

初始化类对象

初始化类对象

PSV《讨鬼传 极》黄金狢速刷方法详细解析

PSV《讨鬼传 极》黄金狢速刷方法详细解析
下拉加载更多内容 ↓