拷贝(复制)构造函数定义及3种调用情况举例

您所在的位置:网站首页 什么叫实例化一个对象呢 拷贝(复制)构造函数定义及3种调用情况举例

拷贝(复制)构造函数定义及3种调用情况举例

2024-07-10 20:31| 来源: 网络整理| 查看: 265

一、拷贝构造函数是一种特殊的构造函数,其形参为本类的对 象引用。 class 类名  { public : 类名(形参);//构造函数                 类名(类名 &对象名);//拷贝构造函数 ... }; //拷贝构造函数 ...  类名::类(类名 &对象名)//拷贝构造函数的实现 { 函数体 } 如: Box∷Box(const Box& b) { height=b.height; width=b.width; length=b.length; }

复制构造函数也是构造函数,但它只有一个参数,这个参数是本类 的对象(不能是其他类的对象),而且采用对象的引用的形式(一般约定 加const声明,使参数值不能改变,以免在调用此函数时因不慎而使对 象值被修改)。 如果用户自己未定义复制构造函数,则编译系统会自动提供一个默认的 复制构造函数,其作用只是简单地复制类中每个数据成员。

二、请注意普通构造函数和复制构造函数的区别

(1) 在形式上

类名(形参表列); //普通构造函数的声明,如Box(int h,int ,int en);

类名(类名& 对象名); //复制构造函数的声明,如Box(Box &b);

(2) 在建立对象时,实参类型不同

系统会根据实参的类型决定调用普通构造函数或复制构造函数。

如 Box box1(12,15,16); //实参为整数,调用普通构造函数

Box box2(box1); //实参是对象名,调用复制构造函数

(3) 在什么情况下被调用

普通构造函数在程序中建立对象时被调用。 复制构造函数在用已有对象复制一个新对象时被调用,在以下3 种情况下需要克隆对象:

① 程序中需要新建立一个对象,并用另一个同类的对象对它初始化:

box2=box1//box2(box1)

② 当函数的参数为类的对象时。在调用函数时需要将实参对象 完整地传递给形参,也就是需要建立一个实参的拷贝,这 就是按实参复制一个形参,系统是通过调用复制构造函数 来实现的,这样能保证形参具有和实参完全相同的值。如

void fun(Box b) //形参是类的对象

{  }

int main( )

{Box box1(12,15,18);

fun(box1); //实参是类的对象,调用函数时将复制一个新对象b

return 0;

}

③ 函数的返回值是类的对象。 在函数调用完毕将返回值带回函数调用处时。此时需要将函数中的对象 复制一个临时对象并传给该函数的调用处。如:

Box f( ) //函数f的类型为Box类类型

{ Box box1(12,15,18);

return box1; //返回值是Box类的对象

}

int main( )

{Box box2; //定义Box类的对象box2

box2=f( ); //调用f函数,返回Box类的临时对象,并将它赋值给box2

}

以上几种调用复制构造函数都是由编译系统自动实现的,不必由用户自 己去调用,只要知道在这些情况下需要调用复制构造函数就可以了。

三、调用拷贝构造函数的例子(Point类为例) #include "iostream" using namespace std; //定义一个Point类 class Point{ public: Point(int xx=0,int yy=0):x(xx),y(yy){} //构造函数 ~Point(){ }; //析构函数 Point(const Point &p); //复制构造函数 int getX()const{return x;} int getY()const {return y;} private: int x,y;//私有成员 }; Point::Point(const Point &p) { x = p.x; y = p.y; cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3