4重载增1运算符“+ +”
+ +既可以是前缀运算符(前增1),又可以是后缀运算符(后增1)。为了区分这两种情况,重载这两个运算符时必须在格式上有所区别:重载后缀+ +时必须多一个虚拟参数:int,因此从形式上看像是一个二元运算符重载。
5重载类型转换符“long”
类型转换符必须作为成员函数重载。在重载类型转换符时,由于运算符本身已经表示出返回值类型,因此不需要返回值类型的声明。一个分数可以看成是由一个整数部分和一个纯分数部分组成的,为了取得一个分数的整数部分,可为fraction重载类型转换符long。为此可在fraction.h的类声明中增加:
opertator long()const { return num/den;}
6重载赋值运算符“=”
赋值运算符只能作为成员函数重载。
常见的真正需要重载赋值运算符的情况是:类中包含指向动态空间的指针
赋值运算符=的重载应注意以下几点:
①返回值声明为引用,而函数体中总是用语句return *this;返回;
②如果参数被声明为指向同类对象的引用或指针,应判别所指向对象的是否与被赋值对象为同一对象,如果是,立即返回,不做任何赋值处理;
③如果被赋值对象占用了动态空间或其他资源,应首先释放这些资源,以便接收新的资源;
④如果参数被声明为指针或引用,通常应加上const修饰;
⑤如果参数被声明为指针,应判别是否为空,以便做出特殊处理;
⑥一个类如果需要重载运算符=,通常也就需要定义自己特有的拷贝构造函数,反之亦然。
7重载复合赋值运算符“+=”
重载复合赋值类运算符,如+=、-=等,也应遵循上述重载赋值运算符的注意事项。
与赋值运算符不同的是,复合赋值类运算符既可作为成员函数重载也可作为非成员函数重载。在后一种情况下,两个操作数都必须出现在参数表中;为了保持运算符原有的特性,第一参数应当声明为引用(否则就无法改变它的值),返回值也应当像重载“=”那样声明为引用,并在最后将获得新值的第一参数返回。
8重载关系操作符“>”
重载的关系操作符函数应返回逻辑值。对于 fraction的两个对象,可以通过比较通分后的两个分子来确定它们的大小。为此,可在fraction.h的类声明中增加如下的成员函数声明:
bool operator>(fraction f){ return num*f.den>f.num*den;}
其他关系运算符可以参照重载。
9重载下标访问运算符“[ ]”
运算符[ ]只能作为成员函数重载。
10重载C+ +流运算符“”和“”
C+ +流的输入运算符和输出运算符只能作为非类成员函数重载。在一个类中,如有必要,可将或声明为友元函数。
编辑推荐:
北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |