重载的运算符是具有特殊名字的函数:它们的名字由关键字 operator 和其后面要定义的运算符号共同组成。 同其他函数一样, 重载的运算符函数也包含返回类型、参数列表以及函数体。
通常情况下, 不该重载逗号, 取地址, 逻辑与和 逻辑或运算符。
下面的准则有助于我们在将运算符定义为成员函数还是普通的非成员函数做出抉择。
赋值(=), 下标([]),调用(())和成员访问箭头(->)必须是成员函数。
复合赋值运算符一般是成员, 但不是必须。
改变状态的运算符或者与给定类型密切相关的运算符, 如递增、递减和解引用运算符, 通常是成员。
具有对称性的运算符可能转换任意一端的运算对象, 例如算术、相等性、 关系和位运算符等, 一般都是普通的非成员函数。
在什么情况下重载的运算符与内置的运算符有区别?在什么情况下重载的运算符又和内置的运算符一样?
Differ: 1. We can call an overloaded operator function directly. 2. An overloaded operator function must either be a member of class or have at least one parameter of class type. 3. A few operators guarantee the order in which operands are evaluated. These overloaded versions of these operators do not preserve order of evaluation and short circuit evaluation, it is ususlly a bad idea to overloaded them.
下面是关于sales_data的oveloaded operation function:
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <iostream>
#include <string>
using namespace std;
class Sales_data
{
friend std::istream& operator >> (std::istream&, Sales_data&);
friend std::ostream& operator << (std::ostream&, const Sales_data&);
friend Sales_data operator+(const Sales_data&, const Sales_data&);
public:
Sales_data() = default;
Sales_data(const std::string &s, unsigned n, double p) : bookNo(s), units_sold(n), revenue(p) {}
Sales_data(const std::string &s) : Sales_data(s, 0, 0.0) {}
Sales_data operator+=(const Sales_data&);
Sales_data(istream &is);
private:
inline double avg_price() const;
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
double Sales_data::avg_price() const
{
return units_sold ? revenue / units_sold : 0;
}
std::istream& operator >> (std::istream&, Sales_data&);
std::ostream& operator << (std::ostream&, const Sales_data&);
Sales_data operator+(const Sales_data&, const Sales_data&);
#endif
#include "sales_data.h"
Sales_data Sales_data::operator+=(const Sales_data& rhs)
{
bookNo += rhs.bookNo;
units_sold += rhs.units_sold;
bookNo += rhs.bookNo;
return *this;
}
Sales_data::Sales_data(istream &is)
{
is >> *this;
}
std::istream& operator >> (std::istream& is, Sales_data& item)
{
double price = 0.0;
is >> item.bookNo >> item.units_sold >> price;
if (is)
{
item.revenue = item.units_sold * price;
}
else
{
item = Sales_data();
}
return is;
}
std::ostream& operator << (std::ostream& os, const Sales_data& item)
{
os << item.bookNo << " " << item.units_sold << " " << item.revenue << " " << item.avg_price() << endl;
return os;
}
Sales_data operator+(const Sales_data& lhs, const Sales_data& rhs)
{
Sales_data sum = lhs;
sum += rhs;
return sum;
}
#include "sales_data.h"
int main()
{
Sales_data cp5;
std::cin >> cp5;
std::cout << cp5 << std::endl;
}