C++ 重载 += 运算符
c++ overloading += operator
我有一个类:
class MyClass{
double a;
double b;
double c;
double d;
public:
MyClass(double _a, double _b, double _c, double _d){
a = _a;
b = _b;
c = _c;
d = _d;
}
MyClass operator+=(const MyClass & rhs){
a += rhs.a;
b += rhs.b;
c += rhs.c;
d += rhs.d;
return this;
}
MyClass operator+(MyClass & rhs){
MyClass newOne(a+rhs.a,b+rhs.b,c+rhs.c,d+rhs.d);
return newOne;
}
}
我像这样使用它:
MyClass my1(1., 2., 3., 4.);
MyClass my2(2., 3., 4., 5.);
MyClass my3(2., 4., 6., 8.);
my2 += my3;
my1 += my2;
这个正在工作,但是当我像这样使用它时
my1 += my2 += my3;
我得到不同的答案。我怎样才能将括号中的表达式算作第一个?例如:
(my1 + my2) + my3 == my1 + (my2 + my3)
目前尚不清楚您期望在此语句中得到什么结果
my1 += my2 += my3;
该语句等效于
my1 += ( my2 += my3 );
根据C++标准(5.17赋值和复合赋值运算符(
1 赋值运算符 (=( 和复合赋值运算符 所有组从右到左。
有效的运算符定义如下所示
MyClass & operator +=( const MyClass & rhs )
{
a += rhs.a;
b += rhs.b;
c += rhs.c;
d += rhs.d;
return *this;
}
考虑到代码中有几个拼写错误。例如,在运算符中,您必须返回 *this 而不是这个,否则类定义应在右大括号后以分号结尾。
至于这个表达
(my1 + my2) + my3 == my1 + (my2 + my3)
那么完全不清楚你想实现什么。您的类没有定义的比较运算符。
您的代码存在几个问题:
-
首先,
operator+=
应返回对值的引用它修改,而不是副本;返回类型应为MyClass&
. -
operator+
应该参考 const,而不是非常常量;不能将临时绑定到一个非常常量。
经典地,operator+
将是一个自由函数,沿着行:
MyClass operator+( MyClass const& lhs, MyClass const& rhs )
{
MyClass results( lhs );
results += rhs;
return results;
}
这样做是为了确保应用相同的转换到+
两侧的操作数;自从你的班级不支持任何转换,没关系,但养成一个好习惯。
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- C++20概念:需要运算符重载
- 使用赋值运算符重载从类中返回jobject
- 在运算符重载定义中使用成员函数(const错误)
- 字节到位运算符重载C++
- 为什么在运算符重载时需要参考?
- 类中 c++ 的运算符 + 重载
- 算术复合运算符重载为非成员
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 交换运算符 + 重载会导致无限递归
- 如何理解新的运算符重载?
- 向量保持复数的运算符重载
- 如何创建运算符重载?
- 链接列表运算符重载没有打印出我想要的内容
- C++:需要帮助了解运算符重载错误
- 使用模板化运算符重载 XOR 运算符失败
- 如何确保接受的C++模板类型使运算符重载?
- 运算符重载使用运算符+添加类模板