運算符重載 定義為類成員函數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 ;
}