分享
 
 
 

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

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

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

作者:康建东

下载本文示例代码

[问题的提出]:

在很多书籍和文章中,很多次提到在对赋值操作符(=)进行重载的时候,要返回对目的(调用)对象实例(*this)的引用。其中不免有这样的论断:一定要返回对调用对象的引用;返回对调用实例对象的引用是为了实现链式连续赋值。

这里说明两个问题:第一,是否重载赋值操作符必须返回对调用对象的引用,第二,是否这样就可以实现链式赋值,而不这样就不行。

首先,必须承认,返回对"*this"的引用是标准的二目操作符重载的格式,效率很高。这样做有很多优点:如实现链式赋值、避免临时对象的产生(调用拷贝构造函数)、销毁(调用析构函数),但不是非这样做不可,下面通过对比来论述返回对"*this"的引用的优点及其他做法的缺点,同时也能清楚第二个问题,我们从例子着手。

// a.h

class 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.cpp

A::A(int nTest)

{

m_nTest = nTest;

cout << "constructor A Value is executed now!" m_nTest = a.m_nTest;

cout << "Copy constructor A is executed now!" 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=返回的是对当前对象的引用,而引用只是别名,而不是构造新对象的。这点可以通过如下函数调用来理解:

void fun(A& temp)

{

temp ...

}

A a;

执行fun(a)函数调用时,没有产生临时对象。

可见,重载"="操作符,不一定要返回对赋值目的对象的引用,但返回引用是很好的做法,建议您这样使用。

最后提出几个问题,大家可以思考一下:

[1] 若将a=b=c; 改为(a=b)=c后分别调用A operator=(const A& a)和A&operator=(const

A& a)结果会有什么不同?

[2] 能否将A&operator=(const A& a)改为const A&operator=(const A& a)?

[3] 能否将A&operator=(const A& a)中的return *this;改为return a?

[4] A a,b;

a = b;

与 A a;

A b = a; 有什么不同?

水平有限,欢迎大家批评指正!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有