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

C++运算符重载求助:实现+=、+、前置++及后置++运算符

搞定C++ Number类的运算符重载:+=、+、前置++、后置++

嘿,新手小伙伴别发愁!运算符重载刚开始确实容易懵,我来帮你一步步补全代码,让你的测试代码完美输出预期结果~

首先,我们先把基础的构造函数和print函数补好,这是后续运算符重载的前提:

Number(int value = 0) : m_value(value) {}

std::ostream& print(std::ostream& ostr = std::cout) const {
    ostr << m_value;
    return ostr;
}

operator<<已经声明了,它的实现其实就是调用print函数,所以补上:

std::ostream& operator<<(std::ostream& ostr, const Number& N) {
    return N.print(ostr);
}

接下来逐个搞定你需要的四个运算符重载:

1. 重载+运算符

a + b需要返回一个新的Number对象,值是两个操作数的和,而且不能修改原来的a和b,所以我们用成员函数实现,参数是const Number&(保证不修改传入的对象),返回值是Number:

Number operator+(const Number& other) const {
    return Number(m_value + other.m_value);
}

这样c = a + b就会创建一个值为30的新Number对象赋值给c,完全符合预期。

2. 重载+=运算符

a += b是把b的值加到a上,然后返回a本身(支持链式调用,比如a += b += c),所以返回值是Number&(引用,避免拷贝),参数是const Number&,实现如下:

Number& operator+=(const Number& other) {
    m_value += other.m_value;
    return *this;
}

测试代码里c = a += b,会先把a变成31,然后把a的引用赋值给c,所以c和a都是31,符合预期输出。

3. 重载前置++运算符

前置++a是先把a的值加1,然后返回修改后的a本身,所以返回Number&,不需要参数(成员函数):

Number& operator++() {
    ++m_value;
    return *this;
}

c = ++a会先把a从10变成11,然后把a的引用赋值给c,所以a和c都是11,和预期一致。

4. 重载后置++运算符

这里要注意和前置的区别!后置b++是先返回b原来的值,再把b加1。为了区分前置和后置,C++规定后置重载要加一个int类型的占位参数(不需要使用这个参数,只是用来标记是后置版本),而且返回值是Number(值类型,因为要返回原来的副本,不能返回引用,因为原来的对象已经被修改了):

Number operator++(int) {
    Number temp(*this); // 保存当前值的副本
    ++m_value; // 自身加1
    return temp; // 返回原来的副本
}

测试代码里c = b++,会先把b原来的20赋值给c,然后b变成21,这正好对应预期输出里的最后一段。

完整的代码

把所有部分整合起来,完整的代码如下:

#include <iostream>
class Number {
private:
    int m_value;
public:
    Number(int value = 0);
    std::ostream& print(std::ostream& ostr = std::cout)const;

    // 重载+运算符
    Number operator+(const Number& other) const;
    // 重载+=运算符
    Number& operator+=(const Number& other);
    // 重载前置++运算符
    Number& operator++();
    // 重载后置++运算符
    Number operator++(int);
};

// 构造函数实现
Number::Number(int value) : m_value(value) {}

// print函数实现
std::ostream& Number::print(std::ostream& ostr) const {
    ostr << m_value;
    return ostr;
}

// operator<<实现
std::ostream& operator<<(std::ostream& ostr, const Number& N) {
    return N.print(ostr);
}

// +运算符实现
Number Number::operator+(const Number& other) const {
    return Number(m_value + other.m_value);
}

// +=运算符实现
Number& Number::operator+=(const Number& other) {
    m_value += other.m_value;
    return *this;
}

// 前置++实现
Number& Number::operator++() {
    ++m_value;
    return *this;
}

// 后置++实现
Number Number::operator++(int) {
    Number temp(*this);
    ++m_value;
    return temp;
}

using namespace std;
void prn(const Number& a, const Number& b, const Number& c) {
    cout << "c a b " << endl << c << " " << a << " " << b << endl;
    cout << "--------------------" << endl;
}
int main() {
    Number a{ 10 }, b{ 20 }, c;
    c = a + b;
    prn(a, b, c);
    c = ++a;
    prn(a, b, c);
    c = a += b;
    prn(a, b, c);
    c = b++;
    prn(a, b, c);
    return 0;
}

运行这段代码,就能得到你想要的预期输出啦!

内容的提问来源于stack exchange,提问作者Sufiyan Mustafa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:24:10