tree_bro 2022-04-19 19:27
浏览 18
已结题

关于“+”和“+=”运算符重载的区别【c++】

问题遇到的现象和发生背景

在一次练习中重载运算符时出了问题,发现重载“+”和重载“+=”的方法不一样。

问题相关代码

下面是验证无误的代码

#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指针指向的值。想请教一下,这两种运算符的重载方式为什么会有这样的区别?

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 4月27日
    • 创建了问题 4月19日

    悬赏问题

    • ¥15 SPSS分类模型实训题步骤
    • ¥15 求解决扩散模型代码问题
    • ¥15 工创大赛太阳能电动车项目零基础要学什么
    • ¥20 limma多组间分析最终p值只有一个
    • ¥15 nopCommerce开发问题
    • ¥15 torch.multiprocessing.spawn.ProcessExitedException: process 1 terminated with signal SIGKILL
    • ¥15 QuartusⅡ15.0编译项目后,output_files中的.jdi、.sld、.sof不更新怎么解决
    • ¥15 pycharm输出和导师的一样,但是标红
    • ¥15 想问问富文本拿到的html怎么转成docx的
    • ¥15 我看了您的文章,遇到了个问题。