第十章 运算符重载
1.运算符重载的方法
(实质:函数重载)
*一般格式:
函数类型名operator 运算符名称(参数表){函数体;}
2.运算符重载的规则
*不允许定义新的运算符
*允许重载的运算符
双目运算符 |
+(加法) - (减法) * (乘法) / (除法) %(取模) |
关系运算符 |
==(等于) != (不等) < > <= >= |
逻辑运算符 |
||(或) && (与) !(非) |
单目运算符 |
+ (正) -(负) *(指针) &(取址) |
自增自减运算符 |
++ -- |
位运算符 |
!(按位或)&(...与)~(...取反)^(...异或)<<(...左移)>>(右移) |
赋值运算符 |
= += - = *= /= ^= <<= >>=... |
空间申请与释放 |
New delete new[] delete[] |
其他 |
() -> ->* , [] |
*不允许重载的运算符:. * :: sizeof ?:
*不能改变操作对象的个数
*不能改变运算符的优先级
*不能改变运算符的结合性
*重载运算符的函数不能有默认参数
*重载的运算符必须与用户自定义类型使用
*用于类对象的运算符一般需要重载(=和&可以不用)
3.运算符重载函数作为类成员函数和友元函数
运算符重载的两种形式:1成员函数2友元函数
*如果运算符重载函数作为成员函数,它可以通过this指针自由访问本类的数据成员,所以可以省略一个形参
*双目运算符重载为友元函数是,由于友元函数不是该类的成员函数,因此在函数的形参表中必须有两个参数,不能省略
约定:
*赋值运算符“=”、下标运算符“[ ]”、函数调用运算符“()”、成员运算符“->”必须作为成员函数重载
*流插入“>>”、流提取运算符“<<”、类型转换运算符函数不能定义为类的成员函数,只能作为友元函数
*一般双目运算符重载为友元成员函数
4.双目运算符重载
5.单目运算符重载
自增自减运算符:
类名 operator ++();//前缀自增
类名 operator ++ (int); //后缀自增
//这里int只当一个符号区别前缀和后缀
6.流插入运算符和流提取运算符重载
Friend istream& operator >>(istream & 自定义名, 类名 & 形参名);{
函数体;
Returned 自定义名;
}
Friend istream& operator <<(ostream & 自定义名, 类名 &形参名);{
函数体;
Returned 自定义名;
}
7.有关运算符重载
*确定要重的是哪一个运算符,向把它用于哪一个类
*了解头文件包含了那些运算符的重载
8.不同类型数据间的转换
*标准类型数据见的转换
隐式、显示:类型名(数据) 或者 (类型名)数据
*用转换构造函数进行不同类型数据的转换
(将一个其他类型的数据转换成一个类的对象)
转换构造函数只能有一个参数,如果有多个参数的话,就不是转换构造函数
类名(指定类型的数据)
类内转换构造函数: 类名(类型名& 对象){函数体;}
*类型转换函数(作用:将一个类的对象转换成另一类的数据)
一般形式:
Operator 类型名()
{函数体;}
·在函数名前不能指定函数类型,函数没有参数;
·类型转换函数只能作为成员函数,因为转换的主题是本类的对象。不能作为友元函数或者普通函数;
*在已经定义了相应的转换构造函数情况下, 将运送符“+”函数重载为友元函数,在进行两个类相加的时候,可以实现交换率
*如果运算符函数重载为成员函数,其的第一个参数必须是本类的对象。当第一个操作的对象不是类对象时,不能将运算符重载为成员函数。如果讲运算符“+”函数重载为类的成员函数,交换率不适用
约定:将双目运算符函数重载为友元函数。单目运算符重载为成员函数;
个人笔记,欢迎指教,未经允许,请勿转载。