当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 为什么要在operator=中返回*this的引用

VC++
面试题目:猫吃老鼠问题的求解
一个最基本的有限元计算程序
简单的表达式求值
C程序移植到VC开发环境下
一个小语言的词法分析程序
A/B 向上取整的方法
马走日棋盘算法
一种随机抽题的简单算法
clone模式在平衡排序二叉树实现中的应用
递归的应用 -- 最简单分形图形实现
比较数据排序前后的查找次数
根据前序和中序序列生成二叉树
如何用CZip/CUnzip类压缩/解压缩文件
使用 random_shuffle() 算法随机化序列元素
Ceb解除打印屏蔽实战
基于SHA-256的HMAC文件校验器
模拟信息加密流程图简介
关于数据校验
浅谈利用RSA算法防止非法注册机的制作
加密它:用新的高级加密标准(AES)保持你的数据安全

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 74 ::
收藏到网摘: n/a

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

下载本文示例代码

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