《4[1].4.2+完成拷贝功能的构造函数》由会员分享,可在线阅读,更多相关《4[1].4.2+完成拷贝功能的构造函数(10页珍藏版)》请在金锄头文库上搜索。
1、版本号:V2006.12,生医学院06级C+程序设计 copyright: 柏毅,C+程序设计(第2版),第4章 类与对象,4.4.2 完成拷贝功能的构造函数,它实际上也是构造函数,它是在初始化时被调用来将一个已知对象的数据成员的值拷贝给正在创建的另一个同类的对象。完成拷贝功能的构造函数的格式如下:ClassName:ClassName(ClassName &变量名)构造函数的参数是该类类型的引用,显然,用这种构造函数来创建一个对象时,必须用一个已产生的同类型对象作为实参。,例使用完成拷贝功能的构造函数#includeclass Testint x, y;public:Test(int a,
2、int b)x=a; y=b;cout调用了构造函数!n;Test(Test ,void main(void)Test t1(10,10);Test t2=t1; /BTest t3(t1); /Ct1.Show();t2.Show();t3.Show();,在上述例子中,编译器自动将B行转换为Test t2(t1);因此,B行和C行都调用了完成拷贝的构造函数,初始化新产生的对象。,1。该函数名与类名相同,并且该函数也不指定返回类型。2。该函数只有一个参数,并且是对某个对象的引用。3。每个类都必须有一个拷贝初始化构造函数。缺省情况下,编译系统自动生成一个缺省拷贝初始化构造函数,作为该类的公有成
3、员。,以上例为例,若在Test类中没有定义一个复制数据成员的构造函数,则编译器自动地生成一个隐含的完成拷贝功能的构造函数:Test:Test(Test 注意:若要求在产生类对象时仅只拷贝同类型对象的部份成员数据,或者类中的成员数据中使用了new运算符动态地申请存储空间进行赋值时,必须在类中显式地定义一个完成拷贝功能的构造函数,以便正确实现成员数据的复制。,完成拷贝功能的构造函数特点如下:,在定义一个类时,可以把一个已知类的对象作为该类的成员,这就是对象成员。说明对象成员的一般格式为:class ClassNameClassName1 c1;ClassName2 c2;ClassNamen cn
4、;public:ClassName(args);.;其中:ClassName1、ClassName2、. ClassNamen是已经定义了类名。,4.4.3 对象成员与构造函数,为了初始化对象成员c1、c2cn,类ClassName的构造函数是通过调用这些对象成员所对应类的构造函数来实现,因此类ClassName的构造函数的形式为:ClassName:ClassName(args):c1(args1),c2(args2),.,cn(argsn) ; 其中冒号后用逗号隔开的c1,c2,cn称为成员的初始化列表。注意:在args中的参数表必须带有类型说明,因此它是形参。而在对象成员初始化列表中的第
5、一个参数表args n ,不要类型说明,并且可以为表达式,这是因为这些参数是实参。,#includeclass Aint x, y;public:A(int a, int b) x=a; y=b;void Show() coutx=xty=yn;class Bint Length, Width;public:B(int a, int b) Length=a; Width=b;void Show( ) coutLength=LengthtWidth=Widthn; ;,例 4.6 初始化对象成员,class Cint r, High;A a1;/DB b1;/Epublic:C(int a, i
6、nt b, int c, int d, int e, int f):a1(e,f), b1(c,d)/F r=a; High=b; void Show( ) coutr=rtHigh=Highn; a1.Show(); b1.Show();void main(void)C c1(25,35,45,55,65,100);/Gc1.Show();,说明:当建立类ClassName的对象时,先调用各个对象成员的构造函数,初始化相应的对象成员,然后才执行类ClassName的构造函数,初始化类ClassName中的其它成员。对对象成员构造函数的调用顺序取决于这些对象成员在类中说明的顺序,与它们在成员初始化列表中的顺序无关。书P127 例4.7 对象创建和撤销的对应关系,