在同一语句中重载运算符+多次
Overloading operator+ multiple times in same statement
我有以下代码来重载operator+
,当程序执行时,它可以正常工作。
在main()
函数中,当我重写语句以将重载的operator+
从工作正常的res= t + t1 + t2
调用到res = t + (t1 + t2)
时,它不再工作。有人能给我一个解决方案,以及原因吗?
已经找到的解决方案是将operator+
的签名从Test operator +(Test &a)
更新为Test operator +(const Test &a)
。在这里,我在参数列表中使用了const
关键字。
#include <iostream>
using namespace std;
class Test
{
private:
int num;
public:
Test(int v)
{
num = v;
}
Test operator+(Test &a)
{
Test r(0);
r = num + a.num;
return r;
}
void show()
{
cout << "n num = " << num;
}
};
int main()
{
Test t(10);
Test t1(20);
Test t2(60);
Test res(0);
res = t + t1 + t2;
res.show();
return 0;
}
问题是通过非常数引用而不是const
引用接受对象。
operator+()
返回的Test
对象是临时的。非常量引用无法绑定到临时引用。
这可能以前起作用的原因是operator+
是从左到右执行的——看起来像这样:
object + object + object
temporary + object
临时仍然具有函数operator+()
,因此它仍然可以被调用。
另一方面,当你使用括号时,它执行如下:
object + object + object
object + temporary
这意味着临时性终止于a
,同样,由于上述原因,这是不可能发生的。
要修复此问题,a(将其转换为const
引用,或者b(传递值(不推荐使用,因为它会在内存中创建不需要的额外副本(:
// a
Test operator +(const Test &a)
// b
Test operator +(Test a)
我还强烈建议将此函数作为const
:
// a
Test operator +(const Test &a) const
// b
Test operator +(Test a) const
现在,您可以添加const
对象,即使它们也在右侧。
(t1 + t2)
的计算结果为右值表达式。
但是你的operator+(&)
只能绑定到非常值。另一方面,const &
可以同时绑定左值和右值,因此operator+(const &)
起作用。
相关文章:
- 在c++中多次调用方法
- 在多次运行中获得一致的callgrind输出
- 在 openGL 中多次绑定缓冲区
- 如何多次询问来自QML对话框的输入?
- 如何使用运算符在同一行中多次调用函数
- C++如何在多次执行后记住过去给出的输入
- 在C++中多次调用相同的 lambda
- 如何使用多次 memcpy 转换回 std::vector<unsigned char>?
- 多次实现成员功能
- 函数被多次调用
- 在 c++ 中多次更改字符串列表
- 当要访问的对象被多次封装时,如何正确使用setter
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 如何在派生构造函数中多次构造基类
- 在同一语句中重载运算符+多次
- 在将函数分配给函数指针时,为什么可以多次使用取消任务运算符
- 运算符的多次重载
- 多次调用索引运算符的性能
- 警告:X的默认移动分配运算符将多次移动分配虚拟基类Y
- 在对象数组中,构造函数被调用多次,但运算符new[]只被调用一次,原因是什么