1:当函数以相应的类作为形参列表时,对象可以作为函数的参数传入。在学习函数时,我们曾提过,值传递先复制实参产生副本。那么对象的副本是怎样的呢?
复制构造函数是指类的对象被复制时所调用的函数。下面两种情况中对象都会调用复制构造函数。
(1)将一个对象赋值给另外一个对象时。例如:
对象1=对象2;
对象1(对象2);
上面的程序中对象2的复制构造函数会被调用。
(2)作为值传递的实参。例如:
function(对象1);
在function函数体内,使用的是对象1的副本。所以之前会调用对象1的复制构造函数。
和构造函数一样,C++在未发现自定义的复制构造函数之前会创建一个默认的构造函数。
自定义的复制构造函数的声明格式为:
类名(类名& 形参)
值得注意的是,复制构造函数时引用传递的函数。既然默认复制构造函数已经完成复制工作,那为何需要重新定义它呢?例如,一个类具有指针类型的数据,默认复制构造函数执行之后,原对象和副本的指针成员指向的是同一个内存空间。通过指针改变该内存,就会改变两个对象实际应用的数据(也就是这块内存的内容)。这时可以自定义复制构造函数,将两个指针的内存分离开。
2:代码如下:
(1)germ.h
#include <string> using std::string; class germ{ public: int m_age; string m_name; germ(germ& g);//自定义复制构造函数 类名(类名&形参) germ(string s);//构造函数 ~germ();//析构函数,执行收尾工作 };