第14课 运算符重载
第14课 运算符重载一、运算符重载的概念 1、概念 一符多用。通过重载,对运算符赋予新的含义。 如“+”号,通过重载(C+系统完成),既可以进行整数运算,也可以进行浮点数运算。 2、实例:复数的加法(14_001.cpp) 3、上例:对“+”运算符进行重载(14_002.cpp) -二、运算符重载的规则 1、不允许自己定义新的运算符 2、不能重载的运算符 (1). (成员访问运算符) (2)* (成员指针访问运算符) (3): (域运算符) (4)sizeof (长度运算符) (5)?: (条件运算符) 3、不能改变运算对象的个数 4、不能改变运算符的运算级别 5、不能改变结合性 6、重载运算符的函数不能有默认的参数 7、至少有一个参数是自定义的类对象(不能全是C+的标准类型) 8、用于类对象的运算符必须重载,有两个例外:“=”“&” 9、重载功能应该类似于标准的功能-三、 运算符重载函数作为友元函数 实例:复数相加(14_003.cpp) 说明: 1、在VC+ 6.0中运行此程序,应修改头两行,见程序。 2、由于友元函数会破坏类的封装性,所以应尽量避免使用。四、重载双目运算符(有两个操作数,如“+”) 1、实例:重载字符串比较运算符“=”、“>”、“<”、“!=” 说明:C+的字符串类型,就是对以上的运算符进行了重载,方便了字符串的比较 2、程序(14_004.cpp):以“=”运算符重载为例 注意:如果将重载函数 定义为友元函数,则程序开头两句应改为: #include <iostream.h> 3、重载“+”运算符,对类对象进行相加运算(14_exam.cpp) 4、重载“<”运算符,对类对象进行比较(14_011.cpp) 5、重载“<”运算符,判断点在不在背景空白处(14_012.cpp) -五、重载单目运算符 1、实例:重载运算符“+”(14_005.cpp) 说明:第二个重载函数,多了一个“int”参数,无实际意义,只是与第一个函数区别开来。-六、重载“<<”运算符 1、重载的格式: ostream & operator <<(ostream &,自定义类&); istream & operator >>(istream &,自定义类&); 2、重载“<<”的友元实例(14_006.cpp) 说明: 重载“<<”的函数定义成友元函数的形式,程序开头两句要改为: #include <iostream.h> 3、重载“<<”的普通函数(14_007.cpp) 说明:这种方式,只能将“minute”和“sec”设置成公有成员,破坏了封装性, 总结上面的两种方式,都不是完善的重载方法,“<<”的重载存在着问题。 4、完整的程序,重载“<<”和“>>”的普通函数(14_008.cpp)注意:C+规定,重载“<<”和“>>”的函数 不能做为类的成员函数。-七、不同类型数据间的转换 1、隐式类型转换 int i=6; i=3.5+i; /先把“i”转换成“double”,计算得9.5,然后再转换为“int”,9 2、显式类型转换 i=int(7.5); /C+写法 3、类的转换构造函数 (1)用途:将其它类型的数据转换成类的对象 cp(double r)real=r;imag=0; (2)实例: cp c1(3.5); /将“dubble”类型数据“3.5”转换为复数对象“c1” c1=cp(3.5); /同上 (3)注意:转换构造函数只有一个参数 4、类型转换函数 (1)用途:将一个类的对象转换为其它类型数据 (2)实例: operator double() return real; (3)注意:函数没有参数,只能做为成员函数,根据上下文隐式调用 double d; cp c; d=3.5+c /隐式调用类型转换函数,将“c”转换为“double”类型 5、类型转换函数实例:将一个double数据与一个cp数据相加(14_009.cpp) 6、实例:运算符重载与转换构造函数配合使用(14_010.cpp) 说明:书上程序无法在“VC+6.0”上运行,该程序已做调整,可运行。