C++入门经典-例7.7-对象与复制,菌类的繁殖
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();//析构函数,执行收尾工作 };
(2)germ.cpp
#include "stdafx.h" #include "germ.h" #include <iostream> using std::cout; using std::endl; germ::germ(string s) { m_name = s; m_age = 1; cout<<"发现了"<<m_name<<endl; } germ::germ(germ& g) { g.m_age +=1; this->m_age = 1; this->m_name =g.m_name + "的复制体"; cout<<"产生了"<<g.m_name<<"的复制体"<<endl; } germ::~germ(){ cout<<this->m_name<<"被消灭了"<<endl; }