重载操作符详解

重载操作符是具有特殊名称的函数,保留字operator后接续定义的操作符符号,像任意其他函数一样,重载操作符具有返回类型和形参表。

(1)       重载操作符必须具有一个类类型的操作数

(2)       优先级和结合性是固定的

(3)       不在具有短路求值特性

重载的参数个数

重载一元操作符如果作为成员函数就没有形参,如果作为非成员函数就有一个形参,类似的,重载二元操作符定义为成员时有一个形参,定义为非成员函数时具有两个形参。

举例:

Class Sales_Item

{

       Friendstd::istream& operator >> (std::istream &, Sales_Item);

       Friendstd::ostream& operator <<(std::ostream&, const Sales_Item):

Public:

       Sales_Itemoperator+(const Sale_Item &, const Sale_Item&);

};

1.      输入输出操作符

(1)       输出操作符 <<

注:为了与IO标注库一致,操作符应接受ostream&作为第一个形参,对类类型const对象的引用作为第二个形参,并返回对Ostream形参的引用。

举例:

Ostream &operator << (ostream&out, const Sale_Item &s)

{

          Out<<s.isbn<<”\t”<<s.units_gold<<”\t”;

          Return out;

}

(2)       输入操作符 >>

第一个形参也是引用,只想他要读的流,并返回对同一个流的引用。

举例:

Istream & operator >> (istream &in,Sales_Item&s)

{

          In >>s.isbn >>s.units_gold;

          Return in;

}

2.      算术操作符和关系操作符

一般而言,将算术和关系操作符定义为非成员函数,(注意非成员函数参数个数)

为了与内置操作符保持一致,假发返回一个右值,而不是一个引用

Sales_Item operator+(cosnt Sales_Item& lhs, constSlaes_Item&rhs)

{

        Sales_Itemret(lhs);

        Ret += rhs;

        Return ret;

}

       Inlinebool operator == (const Sales_Item, &lhs, const Sales_Item &rhs)

{

       Returnlhs.units_sold == rhs.units_sold && lhs.revenue == rhs.revenue;

}

3.      赋值操作符

注:赋值操作符可以重载,无论形参为何种类型,赋值操作符必须定义为成员函数,而且,赋值必须返回对*this的引用,赋值操作符必须防止自身赋值。而且赋值操作符不应该为虚函数。

Sales_Item& Sales_Item::operator += (cosnt Sales_Item &rhs)

{

        If( this !=&rhs)

        {

               Units_sold += rhs.units_sold;

               Revenue += rhs.revenue;

        }

        Return *this;

}

4.      自增操作符和自减操作符

(1)       定义前自增/前自减操作符

Class CheckdPtr

{

Public:

        CheckPtr& operator++();

        CheckPtr& operator—();

};

CheckPtr&CheckPtr::operator++()

{

        If(cur == end)

        {

               Throw out_of_ange;

        }

        ++cur;

        Return cur;

}

CheckPtr&CheckPtr::operator--()

{

        If(cur == end)

        {

               Throw out_of_ange;

        }

        --cur;

        Return cur;

}

(2)       定义后缀式操作符

Class CheckdPtr

{

Public:

        CheckPtr operator++(int);

        CheckPtr operator—(int);

};

CheckPtrCheckPtr::operator ++(int)

{

       CheckPtr ret(*this);

       ++*this;

       Return ret;

}

CheckPtrCheckPtr::operator --(int)

{

       CheckPtr ret(*this);

       --*this;

       Return ret;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值