关于C++ return * this的理解

不废话,直接上例子,使用赋值构造函数解释为什么需要 return *this
#include<iostream>
using namespace std;

class Test{
	
public:
	//构造函数
	Test(int i=0, double j=0.0) : m_i(i), m_j(j){
	
	}

	//赋值构造函数
	Test& operator=(Test &rhs){
		this->m_i = rhs.m_i;
		this->m_j = rhs.m_j;
		return * this;
	}
	
	int m_i;
	double m_j;

};


int main(){
	
	//1、赋初值,输出 1  2.3
	Test obj1(1,2.3);
	cout<< obj1.m_i << endl << obj1.m_j <<endl;
	cout << endl << "-------------------" << endl;

	//2、未赋初值,输出0 0
	Test obj2;
	cout<< obj2.m_i << endl << obj2.m_j <<endl;
	cout << endl << "-------------------" << endl;

	//3、未赋初值,但是通过赋值构造函数进行了赋初值,但是注意是重复调用赋值构造函数赋初值。
	Test obj3;
	obj3 = obj2 = obj1;//这里,先进性obj2 = obj1 的操作, (赋值成功后通过return *this,返回obj2对象), 然后进行 obj3 = obj2 的操作。
	cout<< obj2.m_i << endl << obj2.m_j <<endl;
	cout << endl << "-------------------" << endl;
	
	/****
		通过示例3,你会发现,如果没有return * this,你不能够返回obj2对象,
		那么在进行 obj3=obj2 操作的时候,赋值构造函数就不能用了。

		C++ 为了方便我们使用类似于	int i=j=k=5这种赋值方式,
		就必须在从右向左赋值过程中,每次执行完一个赋值操作,返回该对象,然后继续向左执行。
	*****/

	return 0;
}

<think>嗯,用户问的是这段代码中的`return *this`是什么意思,为什么要这么做。我需要先理解这段代码的整体结构。看起来这是一个重载赋值运算符的函数,属于大整数类(BigInteger)的成员函数。函数的作用是将一个长整型数字num赋值给当前对象。 首先,函数内部清空了s容器,然后通过循环将num分解并存入s中,每个元素是num对BASE取模的结果,这应该是将数字按位存储,比如十进制下BASE可能是10,或者更常见的如1000000000这样的基数。处理完num后,函数返回了*this。 接下来要解释return *this的含义。这里的this指针指向当前对象实例,*this就是解引用得到对象本身。赋值运算符通常需要返回当前对象的引用,这样可以支持链式赋值,比如a = b = c。如果返回void,就无法进行这样的操作。所以这里的return *this是为了返回当前对象的引用,符合运算符重载的惯例。 然后要考虑用户可能的疑问:为什么要返回*this而不是别的?这时候需要联系到C++的运算符重载规范,特别是赋值运算符应该返回左值的引用,以便连续赋值。此外,返回当前对象允许链式操作,这是符合预期的行为。 可能用户对this指针理解还不够,需要进一步解释this的作用。在成员函数中,this指向调用该函数的对象,所以在这里,函数处理的是当前对象的数据成员s,处理完后返回自身,使得赋值表达式的结果就是被赋值的对象本身。 还要检查代码是否存在问题。比如,函数参数是long long num,按值传递,这里没有问题。但函数返回的是*this,返回类型是BigInteger,这可能会导致返回一个副本而不是引用。通常赋值运算符应该返回BigInteger&,即当前对象的引用,否则链式赋值虽然能编译,但可能产生不必要的拷贝。所以代码中可能存在一个设计问题,应该修改返回类型为引用。 用户可能没有注意到这一点,所以在解释时需要指出正确的做法应该是返回引用,而当前代码返回的是值,这可能是一个需要修正的地方。但根据用户提供的代码,先按现有代码解释,再指出潜在问题。 总结回答结构:先解释代码功能,再说明return *this的作用,接着讨论为何要这样做(链式赋值、惯例),最后指出代码中可能存在的返回类型问题。</think>$\textcolor{blue}{【代码功能解析】}$ 这段代码实现的是大整数类(BigInteger)的赋值运算符重载,用于将普通整数转换为大整数存储形式。核心操作是将long long类型的数字按BASE进制拆分存储到容器s中。 --- ### $\textcolor{red}{return *this的深层含义}$ ```cpp return *this; // ← 这个操作的三个关键点 ``` 1. **身份证明** - `this`是指向当前对象的指针(好比说"我") - `*this`解引用后得到当前对象本身(相当于说"我自己") 2. **链式赋值支持** 允许连续赋值操作(就像普通int的赋值一样): ```cpp BigInteger a, b; a = b = 100; // 需要返回对象本身才能支持 ``` 3. **标准规范** 赋值运算符重载的国际惯例(C++标准要求返回对象引用) --- ### $\textcolor{green}{代码执行流程图示}$ ``` 原始对象 操作过程 最终对象 ↗ num → 拆解 → 存入s容器 → 返回自己(*this) ↘ 其他对象可通过返回值继续操作 ``` --- ### $\textcolor{orange}{潜在改进建议}$ 当前代码存在一个**隐蔽问题**: ```cpp BigInteger operator = (long long num) { // 应改为返回引用 // ... return *this; // 实际上返回的是副本! } ``` 建议修改为(标准写法): ```cpp BigInteger& operator = (long long num) { // 注意&符号 // ... return *this; // 现在返回的是对象本身 } ``` $\textcolor{red}{区别说明}$: - 不加`&`:每次赋值会生成**新副本**(额外开销) - 加`&`:直接返回**对象本身**(符合赋值语义) --- $\textcolor{blue}{【现实类比】}$ 想象你在快递站填地址: 1. 填写自己的信息(操作s容器) 2. 最后在回执单上签自己的名字(return *this) 3. 这样快递员才知道这份快递属于谁(明确操作对象)
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值