C++运算符重载求助:实现+=、+、前置++及后置++运算符
嘿,新手小伙伴别发愁!运算符重载刚开始确实容易懵,我来帮你一步步补全代码,让你的测试代码完美输出预期结果~
首先,我们先把基础的构造函数和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

