重载运算与类型转换


14.重载运算与类型转换
14.1基本概念
1.重载的运算符是具有特殊名字的函数,由operator和需要重载的运算符组成的函数名,该函数同样需要返回类型、参数列表和函数体。且参数列表必须包含类成员或对象,我们不能重载只包含内置类型的运算符,因为他们都是编译器已经定义好了的。
2.成员运算符必须参数列表第一个参数是类成员或对象
3.重载运算符的调用:
//一个非成员运算符函数的等价调用
data1 + data2;
operator + (data1 , data2); //类似于普通函数的调用
//一个成员运算符函数的等价调用
data1 + data2;
data1.operator + (data2);
4.因为求值顺序的原因,通常情况下,不应该重载逗号、取地址、逻辑与和逻辑或运算符。
5.重载版本应与内置类型版本在返回类型和操作上一致,避免运算符重载的滥用。
6.赋值(=)、下标([ ])、调用(())、和成员访问箭头(->)运算符必须是成员;符合赋值运算符(如+=、-=)一般来说应该是成员,但不是必须;像++、--、*等会改变对象状态的运算符或者与给定类型密切相关的运算符应该是成员;
其他的运算符一般是非成员。

const对象只能调用const成员函数,否则会报如下错误:
不能将“this”指针从“const Sales_data”转换为“Sales_data &” 1> 转换丢失限

14.2
1.重载输入输出运算符时,为了保持其连续性,通常令其返回一个引用,且输出运算符应尽量减少格式化操作,使用户可以控制输出的细节;输入运算符则必须唏嘘处理输入可能失败的情况,并将其恢复。
2.如果类同时定义了算术运算符和相关的复合赋值运算符,则通常情况下应该使用复合赋值来实现算术运算符。
3.如果某个类在逻辑上有相等性的含义,则该类应该定义operator ==和!=,这两个运算符应该吧工作委托给另外一个,一个负责比较操作,另一个负责调用那个真正工作的运算符。
4.如果存在唯一一种逻辑可靠的<定义,则应该考虑为这个类定义<运算符,如果类同时还包含==,则当且仅当<的定义和==产生的结果一致时(两个对象并且那个都不必另一个小)才定义< 运算符。
5.赋值运算符必须定义为非静态成员,符合赋值运算符通常也应该这样做,且两类运算符都应该返回左侧运算对象的引用。
6.下标运算符必须是成员函数,通常会定义两个版本,一个返回一个普通引用,另一个是类的常量成员且返回常量引用普通重载形式无法区分前置和后置递增递减运算符,所以我们令后置版本接受一个额外的(不被使用的)int类型的形参。因为我们不会用到int形参,所以无须为其命名。
7.箭头运算符必须是类的成员,解引用通常是,但并非必须。

原文地址:https://www.cnblogs.com/hi3254014978/p/9412392.html