第五章、运算符重载
一、格式
operator是关键字,是专门用于定义重载运算符的函数的
运算符被重载后,其原有的功能仍然保留,没有丧失或改变
(1)重载为类的成员函数:
返回类型 [类名::]operator 运算符名称(形参表){
对运算符重载的处理;
}
(2)重载为类的非成员函数(一般为友元函数):
friend 返回类型 operator 运算符名称(形参表){
对运算符重载的处理;
}
友元函数没有this指针,需给出所有传递参数
若使用单目运算符且修改成员数据,需使用引用传递
(3)
一般单目运算符重载为类的成员函数,双目运算符重载为类的友元函数
=,(),[],->双目运算符不能重载为类的友元函数
>>和<<只能重载为类的友元函数
二、运算符重载的规则
1、C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载
2、C++不能重载的运算符:
. | 成员访问运算符 |
---|
* | 成员指针访问运算符 | :: | 域运算符 | sizeof | 长度运算符 | ?: | 条件运算符 |
3、重载不能改变运算符运算对象(即操作数)的个数
4、重载不能改变运算符的优先级
5、重载不能改变运算符的结合性:=是右结合性(自右向左)
6、重载运算符的函数不能有默认的参数
7、重载运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应该有一个是类对象
8、用于类对象的运算符一般必须重载,但是有两个例外,运算符“=”和“&”不必用户重载
三、前缀和后缀运算符
1、前缀运算符:++i、–i
类名 operator++();
2、后缀运算符:i++、i–
类名 operator++(int x);//int x为哑元参数,仅表示重载后缀运算符
四、重载流插入运算符和流提取运算符
(1)输入流类istream,输出流类ostream,cin和cout分别是istream,ostream的对象
(2)
class Complex{
public:
friend ostream& operator<<(ostream&,Complex&);
friend istream& operator>>(istream&,Complex&);
private:
double real;
double imag;
}
ostream& operator<<(ostream &out.Complex &c){
out<<c.real<<"+"<<c.imag<<endl;
return out;
}
istream& operator>>(istream &in,Complex &c){
in>>c.real>>c.imag;
return in;
}
|