天天看点

运算符重载 定义为类成员函数or非成员函数

运算符重载 定义为类成员函数or非成员函数

定义为类成员函数:

1. 赋值(=)、下标([ ])、 函数调用(( ))和成员访问箭头(->)

2. 重载的运算符会改变对象状态(如:复合赋值运算符(+=、 -=、 = 、 /= 、 %= 等), 递增、递减运算符, 正(+)、负(-)运算符)或与类对象密切相关(如: 解引用())

定义为非成员函数:

具有 对称性 的运算符, 运算符对象可以转移到任意一端(如算术运算符 (+、 - 、 * 、 / 、 %等),相等性运算符 (==、 !=),关系运算符(>、 >= 、 <、 <=),位运算符 )

输入(>>)、输出运算符(<<)必须是非成员函数。

参考代码

参考 https://github.com/pezy/CppPrimer/blob/master/ch14/ex14_02_sales_data.h
// sales_data.h
    #include <string>
    #include <iostream>
    #include <fstream>
    class sales_data
    {
        friend std::istream& operator>>(std::istream &is, sales_data &data);
        friend std::ostream& operator<<(std::ostream &os, const sales_data &data);
        friend sales_data operator+(const sales_data &lhs, const sales_data &rhs);

    public:
        sales_data(const std::string &No, double price,unsigned sold) 
            : bookNo(No), revenue(price * sold), units_sold(sold)
        {
        }
        sales_data() :sales_data("", , )
        {
        }
        sales_data(const std::string &No) :sales_data(No, , )
        {
        }
        sales_data(std::ifstream &fin);
        std::string isbn() const    {   return bookNo;  }
        sales_data& operator+=(const sales_data &rhs);

    private:
        std::string bookNo;
        double revenue;
        unsigned units_sold;
        inline double avr_price();
    };
        inline double sales_data::avr_price()
    {
        return revenue / units_sold;
    }

    std::istream& operator>>(std::istream &is, sales_data &data)
    {
        double price = ;
        is >> data.bookNo >> price >> data.units_sold;
        if (is)
            data.revenue = price * data.units_sold;
        else
            data = sales_data();
        return is;
    }

    std::ostream& operator<<(std::ostream &os, const sales_data &data)
    {
        os << data.bookNo << "  " << data.revenue << "  " 
            << data.units_sold;
        return os;
    }

    sales_data operator+(const sales_data &lhs, const sales_data &rhs)
    {
        sales_data ret = lhs;
        ret += rhs;
        return ret;
    }
    sales_data& sales_data::operator += (const sales_data &rhs)
    {
        if (bookNo == rhs.bookNo)
        {
            revenue += rhs.revenue;
            units_sold += rhs.units_sold;
            return *this;

        }
        else
            //throw(std::string("two adders' bookNo should be the same"));
            throw("two adders' bookNo should be the same");
        //assert(bookNo == rhs.bookNo);
        //std::cout << "two adders' bookNo should be the same" << std::endl;
    }

    sales_data::sales_data(std::ifstream &fin)
    {
        fin >> *this;
    }
           
// main.cpp
    #include <iostream>
    #include "sales_data.h"
    #include <string>
    int main()
    {

        sales_data data1("c++ primier2", , );
        sales_data data2("c++ primier1", , );
        try
        {
            std::cout << data1 + data2 << std::endl;
        }
        catch (const char* str)
        {
            std::cout << str << std::endl;
        }
        return ;
    }
           

继续阅读