C++对象的复制

时间:2014-10-29 18:59    点击:

有时需要用到多个完全相同的对象,例如,同一型号的每一个产品从外表到内部属性都是一样的,如果要对每一个产品分别进行处理,就需要建立多个同样的对象,并要进行相同的初始化,用以前的办法定义对象(同时初始化)比较麻烦。此外,有时需要将对象在某一瞬时的状态保留下来。

C++提供了克隆对象的方法,来实现上述功能。这就是对象的复制机制。

用一个已有的对象快速地复制出多个完全相同的对象。如
   Box box2(box1);
其作用是用已有的对象box1去克隆出一个新对象box2。

其一般形式为:
    类名  对象2(对象1);
用对象1复制出对象2。

可以看到,它与定义对象的方式类似,但是括号中给出的参数不是一般的变量,而是对象。在建立对象时调用一个特殊的构造函数——复制构造函数(copy constructor)。这个函数的形式是这样的:

  1. //The copy constructor definition.
  2. Box::Box(const Box& b)
  3. {
  4. height=b.height; width=b.width; length=b.length;
  5. }
复制构造函数也是构造函数,但它只有一个参数,这个参数是本类的对象(不能是其他类的对 象), 而且采用对象的引用的形式(一般约定加const声明,使参数值不能改变,以免在调用此函数时因不慎而使对象值被修改)。此复制构造函数的作用就是将实参 对象的各成员值一一赋给新的对象中对应的成员。 复制对象的语句     Box box2(box1); 这实际上也是建立对象的语句,建立一个新对象box2。由于在括号内给定的实参是对象,因此编译系统就调用复制构造函数(它的形参也是对象), 而不会去调用其他构造函数。实参box1的地址传递给形参b(b是box1的引用),因此执行复制构造函数的函数体时,将box1对象中各数据成员的值赋 给box2中各数据成员。 如果用户自己未定义复制构造函数,则编译系统会自动提供一个默认的复制构造函数,其作用只是简单地复制类中每个数据成员。C++还提供另一种方便用户的复制形式,用赋值号代替括号,如     Box box2=box1; //用box1初始化box2 其一般形式为    类名 对象名1 = 对象名2; 可以在一个语句中进行多个对象的复制。如    Box box2=box1,box3=box2; 按box1来复制box2和box3。可以看出,这种形式与变量初始化语句类似,请与下面定义变量的语句作比较:     int a=4,b=a; 这种形式看起来很直观,用起来很方便。但是其作用都是调用复制构造函数。 请注意对象的复制和对象的赋值在概念上和语法上的不同。对象的赋值是对一个已经存在的对象赋值,因此必须先定义被赋值的对象,才能进行赋值。而对象的复制则是从无到有地建立一个新对象,并使它与一个已有的对象完全相同(包括对象的结构和成员的值)。 可以对例9.7程序中的主函数作一些修改:
  1. int main( )
  2. {
  3. Box box1(15,30,25); //定义box1
  4. cout<<"The volume of box1 is "<<box1.volume( )<<endl;
  5. Box box2=box1,box3=box2; //按box1来复制box2,box3
  6. cout<<"The volume of box2 is "<<box2.volume( )<<endl;
  7. cout<<"The volume of box3 is "<<box3.volume( )<<endl;
  8. }
执行完第3行后,3个对象的状态完全相同。 下面说一下普通构造函数和复制构造函数的区别。 1) 在形式上 类名(形参表列); //普通构造函数的声明,如Box(int h,int w,int len); 类名(类名& 对象名); //复制构造函数的声明,如Box(Box &b); 2) 在建立对象时,实参类型不同 系统会根据实参的类型决定调用普通构造函数或复制构造函数。如     Box box1(12,15,16); //实参为整数,调用普通构造函数     Box box2(box1); //实参是对象名,调用复制构造函数 3) 在什么情况下被调用 普通构造函数在程序中建立对象时被调用。复制构造函数在用已有对象复制一个新对象时被调用,在以下3种情况下需要克隆对象: ① 程序中需要新建立一个对象,并用另一个同类的对象对它初始化,如上面介绍的那样。 ② 当函数的参数为类的对象时。在调用函数时需要将实参对象完整地传递给形参,也就是需要建立一个实参的拷贝,这就是按实参复制一个形参,系统是通过调用复制构造函数来实现的,这样能保证形参具有和实参完全相同的值。如
  1. void fun(Box b) //形参是类的对象
  2. { }
  3. int main( )
  4. {
  5. Box box1(12,15,18);
  6. fun(box1); //实参是类的对象,调用函数时将复制一个新对象b
  7. return 0;
  8. }
③ 函数的返回值是类的对象。在函数调用完毕将返回值带回函数调用处时。此时需要将函数中的对象复制一个临时对象并传给该函数的调用处。如
  1. Box f( ) //函数f的类型为Box类类型
  2. {
  3. Box box1(12,15,18);
  4. return box1; //返回值是Box类的对象
  5. }
  6. int main( )
  7. {
  8. Box box2; //定义Box类的对象box2
  9. box2=f( ); //调用f函数,返回Box类的临时对象,并将它赋值给box2
  10. }
以上几种调用复制构造函数都是由编译系统自动实现的,不必由用户自己去调用,读者只要知道在这些情况下需要调用复制构造函数就可以了。

来源:未知//所属分类:基础教程/更新时间:2014-10-29 18:59
顶一下
(0)
0%
踩一下
(0)
0%
上一篇:C++对象之间相互赋值
下一篇:C++静态数据成员
相关内容