C++ 赋值函数为什么返回reference to *this?
2024-09-06 11:27:13
赋值操作为什么要返回 reference to *this? 要弄清这个问题之前,先了解函数的返回值类型:返回值类型,返回引用类型
- 返回值类型:返回的是一个对象的副本。
test operator= (const test &t)
{
...
cout << "赋值" << endl;
return *this;
}
当程序中出现test对象之间的赋值操作时, 调用 operator函数。当return *this的时候,会执行拷贝构造test(const test&t),此时的入参为*this(即调用该operator= 函数的对象),返回的对象由*this构造而成。
- 返回引用类型:返回的是对象本身。
test &operator= (const test &t)
{
...
cout << "赋值" << endl;
return *this;
}
和上面一样,当程序中出现test对象之间的赋值操作时,会执行operator=操作,当return *this的时候,返回的是调用该赋值操作对象的本身。
effective C++中说,是为了实现连锁赋值如a = b =c;下面下一个例子,测试一下,如果不返回引用,就不能实现连锁赋值了吗?
class test
{
public:
test() :i(10)
{
cout << "构造" << endl;
}
~test()
{
}
test(const test &t)
{
this->i = t.i;
cout << "拷贝" << endl;
}
test operator= (const test &t)
{
i = t.i;
cout << "赋值" << endl;
return *this;
}
void setData(int value)
{
i = value;
}
int getData()
{
return i;
}
private:
int i;
};
int _tmain(int argc, _TCHAR* argv[])
{
test a;
test b;
test c;
cout << a.getData() << endl << b.getData() << endl<<c.getData() << endl;
a.setData(20);
c = b= a;
cout << a.getData() << endl << b.getData() << endl << c.getData() << endl;
return 0;
}
结果:,可以看出仅仅是在每次赋值完后多了一次拷贝。现在考虑一个情况
如果是(c=b)=a;这种方式呢?
结果:。分析:因为c=b,返回的是一个临时的对象,因此其实最后a赋值给了一个临时变量且多了一次拷贝。
如果换成reference to *this,test& operator= (const test &t) ,查看结果
(c=b)=a,对象c被成功赋值,且整个过程少了两次拷贝。
有的童鞋可能要问,为什么返回this,不是其他。首先明确一点,this是对象的指针。a=b,调用的是对象a的赋值构造函数,赋值结束后,肯定要返回对象a。例如int a = 1; 赋值结束后,肯定返回的是a。
总结:赋值构造函数为了实现赋值操作完成后,可以作为左值接受其他对象的赋值。因此必须返回一个reference to *this,如果返回位值类型,且如果作为左值,则其其对象得不到想要的赋值结果,因为作为左值的是值类型的临时对象。返回引用reference to *this时,赋值操作作为左值,可得到正确的赋值结果。
最新文章
- .NET里简易实现IoC
- openlayers 3监听地图分辨率变化事件
- 【Hello CC.NET】巧用模板简化配置
- 在64位系统使用PLSQL Developer
- Linux 服务器如何禁止 ping 以及开启 ping
- 使用maven 命令运行项目
- grep正则表达式后面的单引号和双引号的区别
- C#解决微信支付Exception has been thrown by the target of an invocation(调用的目标发生了异常)的问题
- SPRING-MVC访问静态文件,如jpg,js,css
- volatile举列说明const
- Android项目实战(三十六):给背景加上阴影效果
- vue 在methods中调用mounted中的方法?
- 【Spark篇】---Spark中控制算子
- 【Python开发】Python中数据分析环境的搭建
- [C++]2-5 分数化小数
- BZOJ.4513.[SDOI2016]储能表(数位DP)
- 《Linux内核分析》第13章
- MYSQL导入数据时,出现错误:Incorrect string value: &#39;\xF0\x9F...&#39; for column &#39;XXX&#39; at row 1
- MapReduce_架构
- JavaSE——网络编程基础知识