如何重载递增运算符,禁止对象多次递增并保留合法用法?
如何重载递增运算符以限制
++++p并允许++p + b 要实现你想要的效果,核心是修改前置递增运算符的返回值类型,让第一次递增的结果无法被再次递增,同时不影响其参与其他运算。
核心思路
你提到的C语言中++++a无效的本质是:第一次++a返回的是无法被修改的右值,而++运算符要求操作数是可修改的左值。对应到C++的自定义类,我们只需要让前置++运算符返回值类型而非引用,就能达到同样的效果:
- 当
++p返回临时对象(右值)时,第二次++无法作用于这个右值(非const成员函数不能被右值调用),从而触发编译报错。 - 临时对象可以正常参与
+运算(只要operator+是const成员函数),因此++p + b依然合法。
代码实现示例
class Point { private: int x, y; public: Point(int x = 0, int y = 0) : x(x), y(y) {} // 前置递增运算符:返回值而非引用 Point operator++() { x++; y++; return *this; } // 重载+运算符:必须是const成员函数,允许右值调用 Point operator+(const Point& other) const { return Point(x + other.x, y + other.y); } // 可选:编译器默认生成的赋值运算符已满足需求,此处显式定义仅作示例 Point& operator=(const Point& other) { if (this != &other) { x = other.x; y = other.y; } return *this; } };
关键细节说明
前置
++返回值而非引用:- 如果返回
Point&(引用),++p会返回p的左值引用,此时++++p等价于两次对p的递增,是合法的。 - 返回
Point时,++p生成临时对象,右值无法调用非const的operator++(),因此++++p会编译报错。
- 如果返回
operator+必须是const成员函数:- const成员函数可以被左值和右值调用,因此
++p返回的临时对象能正常参与加法运算。 - 如果
operator+是非const的,++p + b也会编译报错,不符合需求。
- const成员函数可以被左值和右值调用,因此
内容的提问来源于stack exchange,提问作者Irtiaz Kabir
相关产品推荐
相关产品推荐

