Version3.0特殊的函数第四章2回顾类成员变量成员函数this指针对象数组3目标复制构造函数复制赋值操作符类型转换构造函数类型转换函数4复制构造函数3-1在下列情况,会调用复制构造函数将某个对象初始化为类的另一个对象时将对象当作参数传递给函数时函数返回对象时5复制构造函数3-2如果没有定义复制构造函数,编译器将自动生成一个自动生成的复制构造函数只是将对象内容逐个字节地copy当数据成员有指针时,将导致两个对象的指针指向同一个地址6复制构造函数3-3定义以对象的引用作为参数的构造函数X::X(X&ptr)或X::X(constX&ptr)使用const关键字,可以确保复制过程不会意外地更改源对象7赋值操作符4-1默认的赋值操作符只是逐个字节地将源对象复制到目标对象#includeiostream.hclassVar1{int*ptr;public:Var1(){ptr=newint;*ptr=0;}Var1(inti){ptr=newint;*ptr=i;}voidshow(){cout*ptrendl;}};voidmain(){Var1s1(20);Var1s2;s2.show();s2=s1;s2.show();}s2的ptr和s1的ptr指到同一个位置8赋值操作符4-2演示默认的赋值操作符9赋值操作符4-3增加:Var1&operator=(constVar1&s){*ptr=*(s.ptr);return*this;}两个对象的ptr指向不同的位置10赋值操作符4-4演示自定义赋值操作符11类型转换构造函数4-1基本数据类型用户自定义类型Distance(floatm){floatf;f=(float)3.28*m;feet=int(f);inches=12*(f-feet);}Distanced1=1.25;12类型转换构造函数4-2演示基本数据类型到用户自定义类型的转换13类型转换构造函数4-3用户自定义类型用户自定义类型LFeet::LFeet(LMetresdm){floatffeet;ffeet=float(3.28*dm.GetMetres());feet=int(ffeet);inches=int(12*(ffeet-feet));}intLMetres::GetMetres(){returnmetre;}14类型转换构造函数4-4演示用户自定义类型的互转15类型转换函数编译器对用户自定义的类型一无所知,必须定义转换函数基本数据类型用户自定义类型类型转换函数用户自定义类型用户自定义类型16从用户自定义类型到基本类型operatorfloat()//转换函数是类型转换操作符的重载{floatf;f=inches/12;f=feet+f;return(float)(f/3.28);}Distanced1(4,1.2f);Distanced2(6,6.72f);floatm=float(d1);//显式调用转换函数m=d2;//隐式调用转换函数17不同类的对象的转换编译器对用户自定义的类型一无所知,必须指定转换函数objectA=objectB;两种实现方法在目标类中定义的类型转换构造函数(已介绍)在源类中定义的转换函数目标类的对象源类的对象18源类中的转换函数operatorDistFeet(){floatf_feet;floatinches;inti_feet;f_feet=(float)3.28*meters;i_feet=int(f_feet);inches=12*(f_feet-i_feet);return(DistFeet(i_feet,inches));}DistMetersdm1=1.0;DistFeetdf1;df1=dm1;//隐式使用转换函数或df1=DistFeet(dm1);//显式使用转换函数19类型转换表转换类型目标类中的函数源类中的函数从基本类型到类构造函数不可以从类到基本类型不可以转换函数从类到类构造函数转换函数20总结复制构造函数复制赋值操作符类型转换构造函数类型转换函数