第5章 运算符重载(2).ppt_第1页
第5章 运算符重载(2).ppt_第2页
第5章 运算符重载(2).ppt_第3页
第5章 运算符重载(2).ppt_第4页
第5章 运算符重载(2).ppt_第5页
已阅读5页,还剩22页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 运算符重载(II),5.3 类型转换运算符的重载,C+允许的类型转换 标准类型-标准类型 标准类型-类类型 转换构造函数 类类型-标准类型 类类型-类类型,类类型转换函数,系统提供的转换方法,5.3 类型转换运算符的重载,标准类型数据间的转换 隐式类型转换 混合运算 将表达式的值赋给变量 实参向形参传值 函数返回结果 显示类型转换 强制法 (类型名)表达式 或 (类型名)(表达式) 函数法 类型名(表达式)如 int (89.3) 标准类型转换为类类型 类类型转换函数,在C+中,某些不同类型数据之间可以自动转换,例如: int i = 6; i = 7.5 + i; 这种转换是由C+编

2、译系统自动完成的,用户不需干预。这种转换称为隐式类型转换。,5.3.1 标准类型转换为类类型,通过转换构造函数实现 转换构造函数(conversion constructor function) 的作用是将一个标准类型的数据转换成一个类的对象。 先回顾一下以前学习过的几种构造函数: 默认构造函数。以Complex类为例,函数原型的形式为: Complex( ); /没有参数 用于初始化的构造函数。函数原型的形式为: Complex(double r,double i); /形参表列中一般有两个以上参数 用于复制对象的拷贝构造函数。函数原型的形式为:,Complex (Complex /形参是本

3、类对象的引用,现在又要介绍一种新的构造函数转换构造函数。 当类 X 具有以下形式的构造函数: X : X ( V , V1 = E1 , V2 = E2 , ) 如: Complex(double r,double image=0) 说明了一种从参数 V 的类型到该类类型的转换,例如: class X / public : X ( int ) ; X ( const char * , int = 0 ) ; ; void f ( X arg ) X a = X( 1 ) ;/ a = 1 X b = “Jessie” ;/ b = X ( “Jessie” , 0 ) a = 2 ;/ a =

4、 X ( 2 ) f ( 3 ) ;/ f ( X ( 3 ) ) f ( 1.5 ) ;/ error ,构造函数的类类型转换,例如: class X / public : X ( int ) ; X ( const char * , int = 0 ) ; ; void f ( X arg ) X a = X( 1 ) ;/ a = 1 X b = “Jessie” ;/ b = X ( “Jessie” , 0 ) a = 2 ;/ a = X ( 2 ) f ( 3 ) ;/ f ( X ( 3 ) ) f ( 1.5 ) ; / error ,构造函数的类类型转换,调用构造函数 X

5、( int ) 把 1 转换为类类型 X 后赋给对象 a 也称 X ( 1 ) 为 X 类的类型常量,例如: class X / public : X ( int ) ; X ( const char * , int = 0 ) ; ; void f ( X arg ) X a = X( 1 ) ;/ a = 1 X b = “Jessie” ;/ b = X ( “Jessie” , 0 ) a = 2 ;/ a = X ( 2 ) f ( 3 ) ;/ f ( X ( 3 ) ) f ( 1.5 ) ; / error ,构造函数的类类型转换,调用构造函数X ( const char *

6、, int = 0 ) 把字符串“Jessie”转换为类类型 X 后赋给对象 b,例如: class X / public : X ( int ) ; X ( const char * , int = 0 ) ; ; void f ( X arg ) X a = X( 1 ) ;/ a = 1 X b = “Jessie” ;/ b = X ( “Jessie” , 0 ) a = 2 ;/ a = X ( 2 ) f ( 3 ) ;/ f ( X ( 3 ) ) f ( 1.5 ) ; / error ,构造函数的类类型转换,隐式调用构造函数 X ( int ) 把 2 转换为类类型 X 后

7、赋给对象 a,例如: class X / public : X ( int ) ; X ( const char * , int = 0 ) ; ; void f ( X arg ) X a = X( 1 ) ;/ a = 1 X b = “Jessie” ;/ b = X ( “Jessie” , 0 ) a = 2 ;/ a = X ( 2 ) f ( 3 ) ;/ f ( X ( 3 ) ) f (1.5 ) ; / error ,构造函数的类类型转换,隐式调用构造函数X ( int ) 对实参作类类型转换,然后进行虚实参数匹配,例如: class X / public : X ( in

8、t ) ; X ( const char * , int = 0 ) ; ; void f ( X arg ) X a = X( 1 ) ;/ a = 1 X b = “Jessie” ;/ b = X ( “Jessie” , 0 ) a = 2 ;/ a = X ( 2 ) f ( 3 ) ;/ f ( X ( 3 ) ) f ( 1.5 ) ; / error ,1.构造函数的类类型转换,当找不到匹配的构造函数时 转换失败,例如: class X / public : X ( int ) ; X ( const char * , int = 0 ) ; ; void f ( X arg

9、) X a = X( 1 ) ;/ a = 1 X b = “Jessie” ;/ b = X ( “Jessie” , 0 ) a = 2 ;/ a = X ( 2 ) f ( 3 ) ;/ f ( X ( 3 ) ) f ( 1.5 ) ; / error ,构造函数的类类型转换,这样的隐式类型转换 是由系统自动完成的,Class vector public: static vector make(int s) vector v=s; /调用构造函数vector(int) return v; friend vector make1(int s) vector v=s; return v p

10、rivate: vector(int s); /构造函数放在私有段 ; void main() vector v1=vector:make(10); vector v2=make1(20); v1=10; /错误,私有构造函数 vector v3(10); /错误 v1=make1(99);,不希望发生隐式转换时: (1)构造函数放在私有段 (2)在共有段设置静态函数或友员函数来调用这个构造函数,类类型转换函数是一种特殊的成员函数,它在类对象之间提供一种类似显式类型转换的机制,5.3.2 类类型转换函数,类类型转换函数语法形式: X : operator T ( ) return T类型的对象

11、 功能:将类型 X 的对象转换为类型 T 的对象 T 可以是预定义类型,也可以是用户定义类型 函数没有参数,没有返回类型,但必须有一条 return 语句,返回 T 类型的数据 该函数只能为成员函数,不能为友员,1.类类型转换函数,例如: class X / public : operator int ( ) ; / ; void f ( X a ) int i = int ( a ) ; i = ( int ) a ; i = a ; ,a 是一个类对象, 它们都用类型转换函数作类型转换相当于i=a.operator int (),1.类类型转换函数,例如: class X / public

12、 : operator int ( ) ; / ; void f ( X a ) int i = int ( a ) ; i = ( int ) a ; i = a ; ,void g ( X a , X b ) int i = ( a ) ? 1 + a : 0 ; int j = ( a ,除了赋值和初始化, 类型转换函数还可以这样使用:,对象 a 、b 可用在整型变量出现的地方,1.类类型转换函数, 类型转换函数有两种使用方式: 隐式使用i = a ; 显式使用i = a . operator int ( )/ int ( a ) ( int ) a, 使用不同函数作类型转换函数: in

13、t i = a ;用类型转换函数进行转换 X a=i ;用构造函数进行转换,1.类类型转换函数,2.类类型转换的二义性,如果一个类既有用于转换的构造函数,又拥有类型转换函数: X ( int ) ;/ 构造函数 operator int ( ) ;/ 类型转换函数,语句 a = a + i ;的解释 1 :,operator int ( ) = temp1,+ i = temp2,temp3 = X ( int ),a,/ 运算结果为整型,/ 转换为类类型,2.类类型转换的二义性,如果一个类既有用于转换的构造函数,又拥有类型转换函数: X ( int ) ;/ 构造函数 operator in

14、t ( ) ;/ 类型转换函数,语句 a = a + i ;的解释 2 :,X ( int ) temp,a,/ 转换为类类型,a +,2.类类型转换的二义性,如果一个类既有用于转换的构造函数,又拥有类型转换函数: X ( int ) ;/ 构造函数 operator int ( ) ;/ 类型转换函数,语句 a = a + i ;,? 编译程序 不知用那种方式解释,例如: X b = i ; a = a + b ;,这种情况下必须显式地使用类型转换函数。,或a = a + X ( i ) ;,类型转换函数可以被继承,可以是虚的 但不能被重载,因为它没有参数,/ ex 分数计算 class R

15、ational public : Rational ( long n = 0 , long d = 0 ) ; friend Rational operator + ( Rational r1 , Rational r2 ) ; operator double ( ) ; / 类型转换函数 void Print ( ) const ; private : long Numerator , Denominator ; ; Rational : Rational ( long n , long d )/ 构造函数 Numerator = n ; Denominator = d ; Rational

16、 operator + ( Rational r1 , Rational r2 )/ 重载算符“ + ” long n , d ; n = r1 . Numerator * r2 . Denominator + r1 . Denominator * r2 . Numerator ; d = r1 . Denominator * r2 . Denominator ; return Rational ( n , d) ; ,Rational : operator double ( ) / 把Rational 类对象转换成 double 类对象 return double ( Numerator )

17、 / double ( Denominator ) ; void Rational : Print ( ) const cout Numerator “/” Denominator endl ; void display ( double d ) cout d endl ; main ( ) Rational a ( 2 , 4 ) , b ( 1 , 2 ) ; a = a + b;/ 使用友员重载“+”和缺省重载“=” a . Print ( ) ;/ 以分数形式显示 display ( a ) ;/ 以实数形式显示,调用了类类型转换函数 ,/例(P196, 例5-27) 解释 opera

18、tor real ( ) / 由整数类 实型类 operator integer ( ) / 由实型类 整数类 注意两类成员函数的实现: i)integer : operator real ( ) / 类型转换函数,整型-实型 ii)real : operator integer ( ) / 实对象-整对象,观察测试程序及执行结果,说明类型转换运算是如何进行。 分析语句 ( P199 ) r3 = real (i1) + r1 ; (主函数第15行) i3 = i1+integer ( r3 ) ; (主函数第20行) 这两个语句均采用强制类型转换,原因: 如不用强制类型转换,则有 r3 = i1 +r1 与 i3 = i1 + r3 两种可能性。 即使得“+”运算产生二义性。 编译程序不知应使用 integer operator + ( integer num1 , integ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论