C++重载-运算符实现三对象连续运算报参数错误如何解决
错误原因
编译报错的核心是违反了C++成员函数重载运算符的参数规则:
- 二元运算符(比如减法
-)如果作为类成员函数重载,左操作数默认是当前实例(通过this指针隐式传递),因此函数只允许接收0个(一元运算符)或1个(二元运算符)参数。 - 你在类定义外额外声明了
A A::operator -(A obj1, A obj2);,相当于给成员版operator-定义了2个入参,直接触发报错,这行多余的声明直接删除即可。
另外现有代码还有两个影响运行效果的问题:
- 重载的
operator-参数是非const左值引用,无法绑定连续运算过程中产生的临时对象,极端场景会触发编译错误,建议改成const引用。 - main函数中计算完
result后没有调用result.show(),反而调用了ob.show(),运行后看不到减法运算的结果。
实现连续减法的修正代码
连续减法是左结合运算,运算顺序为(ob - ob2) - ob1,只要单参数的成员operator-每次返回A类实例,就能天然支持连续运算,不需要写双参数版本。修正后的完整可运行代码如下:
#include <iostream> using namespace std; class A { private: float x, y; public: void set(int a, int b) { x = a; y = b; } void show() { cout << "x = " << x << " y = " << y << endl; } A() {} // 参数加const兼容临时对象传参;函数本身加const,保证不修改左操作数 A operator-(const A& obj1) const { A temp; temp.x = x - obj1.x; temp.y = y - obj1.y; return temp; } }; int main() { A ob1, ob2, ob, result; ob1.set(5, 7); ob2.set(10, 7); ob.set(4, 9); result = ob - ob2 - ob1; result.show(); // 运算结果为 x = -11, y = -5 return 0; }
补充:如果要实现双参数版本的
operator-,必须将其定义为全局函数(需要访问私有成员时可声明为类的友元),不能作为类成员函数存在,当前连续运算场景没有必要这么写。
内容的提问来源于stack exchange,提问作者soran-hamid
相关产品推荐
相关产品推荐

