拷贝构造函数:对象之间复制,或者使用一个对象给另外一个初始化时使用。ios
拷贝构造函数特色:也是构造函数,可是,形参列表中必须有一个对本类对象的引用,而且若是有其余形参必须被初始化。函数
浅拷贝构造函数的特色:简单来讲,浅拷贝构造函数只是将类中成员变量进行简单的赋值。那么,若是有指针类型的成员变量,这种拷贝只会将指针指向的空间的地址进行赋值,拷贝后的对象与源对象中的指针只会指向同一个地址,修改其中一个指针指向的变量的值,将会致使另外一个也发生变化。spa
深拷贝构造函数特色:为了解决浅拷贝构造函数的缺点,能够使用深拷贝构造函数。在深拷贝构造函数中,为全部的指针都申请一段新的空间,而后使用间接寻址的方式进行赋值。指针
简单的一个程序实例( 直接能够运行, 由于Boy类使用的是浅拷贝构造函数,所以king的名字发生了变化以后,jack的名字也发生变化,可是Dog是深拷贝构造函数,所以即便mala的名字发生了变化,可是braze的名字仍然保持不变)code
#include <iostream> using namespace std; class Boy{ public: Boy(const char* name); Boy(const Boy& b); int modifyName(const char name[]); char* getName(); ~boyName(){ delete boyName; } private: char* boyName; } class Dog( public: Dog(const char* name); Dog(const Dog& d); int modifyName(const char name[]); char* getName(); ~Dog(){ delete dogName; } private: char* dogName; ) Boy::Boy(const char* name){ boyName = new char[strlen(name)+1]; strcpy(boyName, name); } Boy::Boy(const Boy& b){ boyName = b.boyName; } char* Boy::getName(){ return boyName; } int Boy::modifyName(const char name[]){ delete boyName; boyName = new char[strlen(name)+1]; strcpy(boyName, name); } Dog::Dog(const char* name){ dogName = new char[strlen(name)+1]; strcpy(dogName, name); } Dog::Dog(const Dog& d){ dogName = new char[strlen(d.dogName)+1]; strcpy(dogName, d.dogName); } char* Dog::getName(){ return dogName; } int Dog::modifyName(const char name[]){ delete dogName; dogName = new char[strlen(name)+1]; strcpy(dogName, name); } int main(){ Boy jack("Jack"); Dog braze("Braze"); cout<<jack.getName()<<" has a dog "<<braze.getName()<<endl; Boy king(jack); Dog mala(braze); king.modifyName("King"); mala.modifyName("mala"); cout<<king.getName()<<" has a dog "<<mala.getName()<<endl; cout<<"*************** see the first boy and his dog **************"<<endl; cout<<jack.getName()<<" has a dog "<<braze.getName()<<endl; cout<<"Because class Boy uses shallow copy constructor so that the name of the first boy is changed when the second boy has his own name "<<endl; }