当运算符作用于类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义。重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成。和其他函数一样,重载运算符也包含返回类型、参数列表以及函数体。
Sales_data& operator = (const Sales_data &);
当我们定义重载运算符时,必须首先决定是将其声明为类的成员函数还是声明为一个普通的非成员函数。
友元函数和成员函数的使用场合:一般情况下,建议一元运算符使用成员函数,二元运算符使用友元函数。
在此网站有很详细地总结和举例http://www.runoob.com/cplusplus/cpp-overloading.html
- 运算符的操作需要修改类对象的状态,则使用成员函数。如需要做左值操作数的运算符(如=,+=,++)
- 运算时,有数和对象的混合运算时,必须使用友元
- 二元运算符中,第一个操作数为非对象时,必须使用友元函数。如输入输出运算符<<和>>
具体规则如下:(此处转载https://www.cnblogs.com/sexybear/p/4551742.html)
运算符 | 建议使用 |
所有一元运算符 | 成员函数 |
= ( ) [ ] -> | 必须是成员函数 |
+= -= /= *= ^= &= != %= >>= <<= , 似乎带等号的都在这里了 | 成员函数 |
所有其它二元运算符, 例如: –,+,*,/ | 友元函数 |
<< >> | 必须是友元函数 |
class Sales_data
{
public:
friend istream& operator >> (istream &, Sales_data &);//运算符>>重载为友元函数
friend ostream& operator << (ostream &, Sales_data &);//运算符<<重载为友元函数
friend Sales_data operator + (Sales_data & lhs, Sales_data & rhs);//声明友元的运算符重载 + 函数
Sales_data& operator = (const Sales_data &);//重载赋值运算符
friend bool operator == (Sales_data &, Sales_data &);//声明有元的重载双目运算符==函数
Sales_data &operator += (const Sales_data &);//声明一个返回sales_item类型的重载运算符+=函数,形参采用常量引用
//......
举例如下:
重载输出运算符<<
ostream& operator<<(ostream &os,const Sales_data &item)
{
os<<item.isbn()<<" "<<item.units_sold<<" "
<<item.revenue<<" "<<item.avg_price();
return os;
}
重载输入运算符>>
isteam &operator>>(istream &is,Sales_data &item)
{
double price;
is>>item.bookNo>>item.units_sold>>price;
if(is) //对读取的输入流进行检查
item.revenue = item.units_sold*price;
else
item = Sales_data();
return is;
}
相等运算符+=
bool operator ==(const Sales_data &lhs,const Sales_data &data)
{
return lhs.isbn() ==rhs.isbn() &&
lhs.unuts_sold ==rhs.units_sold &&
lhs.revenue == rhs.revenue;
符合赋值运算符+=
Sales_data& Sales_data::operator+=(const Sales_data &rhs)
{
units_sold+=rhs.revenue;
revenue+=rhs.revenue;
return *this;
}
函数调用运算符()
class absInt{
int operator()(int val) const {
return val<0 ?-val:val;
}
};
class printString{
public:
PrintString(ostream &o=cout,char = 'c'):
os(o),sep(c){ }
void operator()(const string &s) const {os<<s<<sep};
private:
ostream &os;
char sep;