C++之运算符重载

当运算符作用于类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义。重载的运算符是具有特殊名字的函数:它们的名字由关键字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;
        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值