C++ operator= 操作符重载返回值为什么是自身的引用?

C++ operator= 操作符重载返回值为什么是自身的引用?



1. 内置数据类型连续赋值

int a, b, c = 9;
a = b = c;	// A
(a = (b = c))	// B

(a = b) = c; // C
  • A 处基本类型连续赋值,其效果相当于 B 处,赋值顺序为 [c–>b --> a]
  • C 处赋值,由于小括号优先级最高,因此赋值顺序为 [b–>a ; c–>a]

2. 如果 operator= 返回非自身引用

class Person{
public:
	Person(int id):m_id}{id}{
	}
	Person operator=(const Person &p){
		this->m_id = p.m_id;
		return *this;
	}
private:
	int m_id = o;
};

Person p(1);
Person p2(2);
Person p3(3);
(p = p2) = p3;	//  A

如果 operator=返回的是非自身引用,当前对象会调用【拷贝构造函数】生成一个临时对象作为返回值,这种方式存在两个问题:

  • 返回调用拷贝构造创建临时对象,浪费资源
  • A 处代码, p 最终还是等于 p2,这里因为 p = p2 ⇒ p.operator=(p2),而返回值是临时变量,此时 p3 的值是赋值给了临时变量,故 p == p2 而不是 p3。此时,出现了歧义,故而返回非自身引用不妥。

3. operator= 返回自身引用

class Person{
public:
	Person(int id):m_id}{id}{
	}
	Person& operator=(const Person &p){
		this->m_id = p.m_id;
		return *this;
	}
private:
	int m_id = o;
};

Person p(1);
Person p2(2);
Person p3(3);
(p = p2) = p3;	//  B

由于 operator=返回的是自身的引用,故而完美解决上节中出现的两个问题:

  • 返回自身引用,该过程避免了调用**【拷贝构造】生成临时变量**,自身引用的本质即 别名
  • B 处代码, p 最终还是等于 p3,这里因为 p = p2p.operator=(p2),而返回值是 p 的引用即自身的别名,此时 p3 的值相当于赋值给了 p
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值