1、重载操作符是具有特殊名称的函数:保留字operator后接需定义的操作符符号。
//any special logic to prepare object
//actual output of members
os << // ...
//return ostream object
return os;
in >> // ...
return in ;
public:
CheckedPtr operator++(int);
CheckedPtr operator--(int);
int operator()(int val){
return val < 0? -val : val ;
}
2、重载操作符必须具有至少一个类类型或枚举类型的操作符。
3、操作符的优先级、结合性或操作数目不能改变。重载操作符并不保证操作符的求值顺序,尤其是,不会保证内置逻辑AND、逻辑OR和逗号操作符的操作数求值。
4、使用重载操作符的方式,与内置类型操作数上使用操作符的方式一样。假定item1和item2是Sales_item对象,可以打印它们的和,就像打印两个int的和一样:
cout<<item1 + item2 <<endl;
也可以像调用普通函数一样调用重载操作符函数,指定函数并传递适当类型适当数目的形参:
cout << operator+(item1 , item2) << endl;
5、重载逗号、取地址、逻辑与、逻辑或等操作符通常不是好做法。
6、输入和输出操作符:
输出操作符<<的重载:操作符应接受ostream&作为第一个形参,对类类型const对象的引用作为第二个形参,并返回对ostrean形参的引用。
ostream&
operator<<(ostream& os, const ClassType &object)
{
}
7、IO操作符必须为非成员函数。
8、输入操作符>>的重载
istream&
operator>>( istream& in ,Sales_item& s)
{
}
设计输入操作符时,如果可能,要确定错误恢复措施。
9、赋值操作符可以重载,无论形参为何种类型,赋值操作符必须定义为成员函数。赋值必须返回对*this的引用。
10、重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己的箭头操作符的类类型对象。
11、定义自增/自减操作符:后缀式操作符函数接受一个额外的(即,无用的)int型形参。
如:class CheckedPtr{
};
12、调用操作符和函数对象:可以为类类型的对象重载函数调用操作符。
如:struct absInt{
};
这个类定义了一个操作:函数调用操作符,该操作符有一个形参并返回形参的绝对值。通过类类型的对象提供一个实参表而使用调用操作符,所用的方式看起来像一个函数调用:
int i = -42;
absInt absObj;
unsigned int ui = absObj(i);
//calls absInt::operator(int)
尽管absObj是一个对象而不是函数,仍然可以“调用”该对象,效果是运行由absObj对象定义的重载调用操作符。
定义了调用操作符的类,其对象常称为函数对象,即它们的行为类似函数的对象。