1、C+类对象的复制拷贝构造函数出处:PConline 2005 年 03 月 09 日 作者:管宁 责任编辑:xietaoming文章导读:如果一个类拥有资源(堆,或者是其它系统资源 ),当这个类的对象发生复制过程的时候,这个过程就可以叫做深拷贝,反之对象存在资源但复制过程并未复制资源的情况视为浅拷贝。在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int b =a; 自己定义的类的对象同样是对象,谁也不能阻止我们用以下的方式进行复制,例如:#include using namespace st
2、d; class Test public: Test(int temp) p1=temp; protected: int p1; ; void main() Test a(99); Test b=a; 普通对象和类对象同为对象,他们之间的特性有相似之处也有不同之处,类对象内部存在成员变量,而普通对象是没有的,当同样的复制方法发生在不同的对象上的时候,那么系统对他们进行的操作也是不一样的,就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的,在上面的代码中,我们并没有看到拷贝构造函数,同样完成了复制工作,这又是为什么呢?因为当一个类没有自定义的拷贝构造函数的时候系统会自动提供一个
3、默认的拷贝构造函数,来完成复制工作。 下面,我们为了说明情况,就普通情况而言(以上面的代码为例 ),我们来自己定义一个与系统默认拷贝构造函数一样的拷贝构造函数,看看它的内部是如何工作的! 代码如下:#include using namespace std; class Test public: Test(int temp) p1=temp; Test(Test class Internet public: Internet(char *name,char *address) cout using namespace std; class Internet public: Internet()
4、; Internet(char *name,char *address) cout using namespace std; class Internet public: Internet(char *name,char *address) cout using namespace std; class Internet public: Internet(char *name,char *address) cout“载入构造函数“endl; strcpy(Internet:name,name); Internet(Internet strcpy(Internet:name,temp.name); cin.get(); Internet() cout“载入析构函数!“; public: char name20; char address20; ; void main() Internet couta.name; cin.get(); 引用本身是对象的别名,和复制并没有关系,所以不会调用拷贝构造函数,但要注意的是,在 c+看来: Internet 是等价与: Internet a(“中国软件开发实验室“,“dev-“); 的,注意观察调用析构函数的位置(这种情况是在 main()外调用,而无名对象本身是在 main()内析构的) 。