资源描述
单击此处编辑母版标题样式,第一级,第二级,*,特殊的函数,第四章,回顾,类,成员变量,成员函数,this,指针,对象数组,2,目标,复制构造函数,复制赋值操作符,类型转换构造函数,类型转换函数,3,复制构造函数,3-1,在下列情况,会调用复制构造函数,将某个对象初始化为类的另一个对象时,将对象当作参数传递给函数时,函数返回对象时,4,复制构造函数,3-2,如果没有定义复制构造函数,编译器将自动生成一个,自动生成的复制构造函数只是将对象内容逐个字节地,copy,当数据成员有指针时,将导致两个对象的指针指向同一个地址,5,复制构造函数,3-3,定义,以对象的引用作为参数的构造函数,X:X(,X &,ptr,),或,X:X(,const,X &,ptr,),使用,const,关键字,可以确保复制过程不会意外地更改源对象,6,赋值操作符,4-1,默认的赋值操作符只是逐个字节地将源对象复制到目标对象,#include ,class Var1,int *,ptr,;,public:,Var1(),ptr,= new int;,*,ptr,= 0;,Var1(int i),ptr,= new int;,*,ptr,= i;,void show (),cout, *,ptr,endl,;,;,void main(),Var1 s1(20);,Var1 s2;,s2.show();,s2 = s1;,s2.show();,s2,的,ptr,和,s1,的,ptr,指到同一个位置,7,赋值操作符,4-2,演示,默认的赋值操作符,8,赋值操作符,4-3,增加:,Var1 & operator = (const Var1 & s),*,ptr,= *(,s.ptr,);,return *this;,两个对象的,ptr,指向不同的位置,9,赋值操作符,4-4,演示自定义赋值操作符,10,类型转换构造函数,4-1,基本数据类型 用户自定义类型,Distance(,float,m,),float f;,f = (float)3.28 * m;,feet =,int(f,);,inches = 12 * (f - feet);,Distance d1 = 1.25;,11,类型转换构造函数,4-2,演示,基本数据类型,到用户自定义类型的转换,12,类型转换构造函数,4-3,用户自定义类型 用户自定义类型,LFeet:LFeet,(,LMetres,dm,) ,float,ffeet,;,ffeet,= float(3.28 *,dm.GetMetres,(),);,feet =,int(ffeet,);,inches = int(12 * (,ffeet,- feet);,int,LMetres:GetMetres,() ,return metre;,13,类型转换构造函数,4-4,演示,用户自定义类型的互转,14,类型转换函数,编译器对用户自定义的类型一无所知,必须定义转换函数,基本数据类型 用户自定义类型,类型转换函数,用户自定义类型 用户自定义类型,15,从用户自定义类型到基本类型,operator float(),/,转换函数是类型转换操作符的重载,float f;,f = inches / 12;,f = feet + f;,return (,float)(f,/ 3.28);,Distance d1(4, 1.2f);,Distance d2(6, 6.72f);,float m = float(d1) ;,/,显式调用转换函数,m = d2;,/,隐式调用转换函数,16,不同类的对象的转换,编译器对用户自定义的类型一无所知,必须指定转换函数,objectA,=,objectB,;,两种实现方法,在目标类中定义的类型转换构造函数(已介绍),在源类中定义的转换函数,目标类的对象,源类的对象,17,源类中的转换函数,operator,DistFeet,(),float,f_feet,;,float inches;,int,i_feet,;,f_feet,= (float)3.28 * meters ;,i_feet,= int (,f_feet,);,inches = 12 * (,f_feet,-,i_feet,);,return (,DistFeet(i_feet, inches);,DistMeters,dm1 = 1.0;,DistFeet,df1;,df1 = dm1;,/,隐式使用转换函数,或,df1 =,DistFeet,(dm1);,/,显式使用转换函数,18,类型转换表,转换类型,目标类中的函数,源类中的函数,从基本类型到类,构造函数,不可以,从类到基本类型,不可以,转换函数,从类到类,构造函数,转换函数,19,总结,复制构造函数,复制赋值操作符,类型转换构造函数,类型转换函数,20,
展开阅读全文