You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重载递增运算符,禁止对象多次递增并保留合法用法?

如何重载递增运算符以限制++++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;
    }
};

关键细节说明

  1. 前置++返回值而非引用:

    • 如果返回Point&(引用),++p会返回p的左值引用,此时++++p等价于两次对p的递增,是合法的。
    • 返回Point时,++p生成临时对象,右值无法调用非const的operator++(),因此++++p会编译报错。
  2. operator+必须是const成员函数:

    • const成员函数可以被左值和右值调用,因此++p返回的临时对象能正常参与加法运算。
    • 如果operator+是非const的,++p + b也会编译报错,不符合需求。

内容的提问来源于stack exchange,提问作者Irtiaz Kabir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:48:25