运算符重载
一.一般形式
返回类型 operator 操作符 (参数列表)
二.成员函数or友元函数?
- 大部分运算符重载函数既可以是成员函数,也可以使友元函数。使用友元函数的形式如下:
friend 返回类型 operator 操作符 (参数列表)
eg:
成员函数:Int operator + (const Int &);
友元函数:friend Int operator + (const Int &, const Int &);
注意:跟成员函数不同的是参数列表。友元函数的参数列表中比成员函数多一个参数,因为成员函数可以通过this指针隐式的访问对象的参数,而友元必须指定。
- 运算符重载函数定义为成员函数或是友元函数的几点依据:
- 重载运算符(),【】,->或任意赋值运算符时,必须为成员函数
- 当运算符重载函数是一个成员函数时,最左边的操作数必须是类的一个对象(或引用),例如上例中+左边为Int。如果左边的操作数必须是一个不同类的对象或内部类型的对象,运算符函数必须是友元函数。(解释:通过成员函数重载的运算符是由运算符左边的对象调用的,该对象通过this指针隐式传递,因此,最左边的操作数必须是一个对象。将运算符重载函数声明为友元函数时,因为没有隐含的this指针,所以必须显示指定所有参数。)
- 对二元运算符,成员函数带一个参数,友元函数带两个参数。对一元运算符,成员函数不带参数,友元函数带一个阐述。
三.可重载or不可重载的运算符
不可被重载的运算符:
.*, ::, ?:, sizeof
四.其他
1.前置后置运算符如何区分?
前置:Integer& operator ++ () friend Integer& operator ++(Integer & a);
后置:Integer operator ++ (int) friend Integer operator ++ (Integer & a, int);
int只是一个伪值,用于区分前置后置运算符