问题遇到的现象和发生背景
在一次练习中重载运算符时出了问题,发现重载“+”和重载“+=”的方法不一样。
问题相关代码
下面是验证无误的代码
#include <iostream>
using namespace std;
class Sales_data
{
//输入书号、销量和收入
friend istream& operator>>(istream&, Sales_data&);
//输出书号、销量、收入和均价
friend ostream& operator<<(ostream&, const Sales_data&);
friend bool operator==(const Sales_data&, const Sales_data&);
friend bool operator!=(const Sales_data&, const Sales_data&);
// for "+", assume that both objects refer to the same book
friend Sales_data operator + (const Sales_data& s1, const Sales_data& s2) {
Sales_data s;
s.bookNo = s1.bookNo;
s.units_sold = s1.units_sold + s2.units_sold;
s.revenue = s1.revenue + s2.revenue;
return s;
};
public:
Sales_data() : units_sold(0), revenue(0.0) {}
Sales_data(const string& s, unsigned n, double r) :
bookNo(s), units_sold(n), revenue(r)
{}
string get_bookNo() const {
return this->bookNo;
};
// for "+=", assume that both objects refer to the same book
Sales_data& operator += (const Sales_data& s) {
bookNo = this->bookNo;
units_sold = this->units_sold + s.units_sold;
revenue = s.revenue + this->revenue;
return *this;
};
private:
double avg_price() const {
return this->revenue / this->units_sold;
}; //均价,等于收入除以销量
string bookNo; //书号
unsigned units_sold; //销量
double revenue; //收入
};
istream& operator >>(istream& stream, Sales_data& s) {
stream >> s.bookNo;
stream >> s.units_sold;
stream >> s.revenue;
return stream;
}
ostream& operator <<(ostream& stream, const Sales_data& s) {
stream << s.get_bookNo() << " ";
stream << s.units_sold << " ";
stream << s.revenue << " ";
stream << s.avg_price();
return stream;
}
bool operator == (const Sales_data& s1, const Sales_data& s2) {
if (s1.bookNo == s2.bookNo) {
return true;
}
else
return false;
}
bool operator != (const Sales_data& s1, const Sales_data& s2) {
return !(s1 == s2);
}
int main()
{
Sales_data item1, item2;
while (std::cin >> item1 >> item2)
{
std::cout << item1 << "\n" << item2 << "\n";
if (item1 == item2) {
std::cout << item1.get_bookNo() << " equals " << item2.get_bookNo() << "\n";
std::cout << (item1 + item2) << "\n";
//item1 += item2;
std::cout << (item1+=item2) << "\n";
}
else if (item1 != item2)
std::cout << item1.get_bookNo() << " doesn't equal " << item2.get_bookNo() << "\n";
}
return 0;
}
我想要达到的结果
可以看到,重载“+”时,在重载函数里重新生成了一个对象用作返回值,这里尝试过调用this指针,但是报错了。而在重载“+=”时,可以直接返回this指针指向的值。想请教一下,这两种运算符的重载方式为什么会有这样的区别?