重载操作符是具有特殊名称的函数,保留字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;
}