▲基本概念
(1)重载运算符是具有特殊名字的函数,它们的名字又operator和其后要定义的运算符号共同构成。、
(2)对于一个运算符号来说它或者是类的成员,或者至少含有一个类类型的参数。
(3)我们只能重载已有的运算符,而无权发明新的运算符
▲调用重载的运算符函数
类外的重载运算符
a+b等同于operator+(a,b)
类内的重载运算符a+b等同于a.operator+(b);
class gaofang{
public :
int x, y;
int operator+ (gaofang& b)const{
return x+y+b.x+b.y;
}
};
int operator-(gaofang a, gaofang b){
return a.x + a.y - b.x - b.y;
}
int main(){
gaofang a, b;
printf("%d %d\n", a+b, a.operator+(b));
printf("%d %d\n", a-b, operator-(a, b));
return 0;
}
▲重载函数作为成员或非成员
将重载函数在成员函数与非成员函数之间的选择上通常遵循如下几点
(1)赋值(=),下标([]),调用(()),和成员访问箭头(->)运算符必须是成员
(2)复合赋值运算符一般来说应该是成员,但并非必须。
(3)改变对象状态的运算符通常应该是成员。
(4)具有对称性的运算符通常应该定义成非成员函数。
例如
string s = "world";
s = s+"hello"; //正确
s = "hello" + s; //如果+是成员函数,则错误
▲重载输入输出运算符
输入输出运算符必须是非成员函数。
⊙重载输出运算符
通常情况下,输出运算符的第一个形参是一个非常量ostream对象的引用,之所以是非常量是因为向流中写入内容会改变流的状态,引用是因为我们无法直接复制一个ostream对象。
第二个形参一般是一个常量的引用,打印不会改变该对象的内容。
⊙重载输入运算符
与输出运算符不同的是,第二个参数必须是一个非常量的引用,因为是向一个类里面输入。
例子
istream &operator>>(istream &is, gaofang &a){
is >> a.x >> a.y;
return is;
if(!is) a.x = 1, a.y = 0; //当输入错误的时候将a初始化
}
▲下表运算符
表示容器的类通常可以通过元素在容器中的位置来访问元,这些类一般会定义下标运算符operator[]
⊙
原文:http://www.cnblogs.com/icodefive/p/4937805.html