1、拷贝构造函数:对象之间复制,或者使用一个对象给另一个初始化时使用。
2、拷贝构造函数特点:也是构造函数,但是,形参列表中必须有一个对本类对象的引用,并且如果有其他形参必须被初始化。
3、浅拷贝构造函数的特点:简单来说,浅拷贝构造函数只是将类中成员变量进行简单的赋值。那么,如果有指针类型的成员变量,这种拷贝只会将指针指向的空间的地址进行赋值,拷贝后的对象与源对象中的指针只会指向同一个地址,修改其中一个指针指向的变量的值,将会导致另一个也发生变化。
4、深拷贝构造函数特点:为了解决浅拷贝构造函数的缺点,可以使用深拷贝构造函数。在深拷贝构造函数中,为所有的指针都申请一段新的空间,然后使用间接寻址的方式进行赋值。
5、简单的一个程序实例( 直接可以运行, 因为Boy类使用的是浅拷贝构造函数,因此king的名字发生了变化之后,jack的名字也发生变化,但是Dog是深拷贝构造函数,因此即使mala的名字发生了变化,但是braze的名字仍然保持不变)
#include
using namespace std;
class Boy{
public:
Boy(char* name);//普通的构造函数声明
Boy(Boy &b);//浅拷贝构造函数声明
int modifyName(char name[]);
char *getName();
private:
char *BoyName;
};
class Dog{
public:
Dog(char *name);//普通的构造函数声明
Dog(Dog &d);//深拷贝构造函数声明
int modifyName(char name[]);
char *getName();
private:
char *DogName;
};
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;
}
Boy::Boy(char *name){
BoyName = new char[strlen(name)+1];
strcpy(BoyName, name);
}
Dog::Dog(char *name){
DogName = new char[strlen(name)+1];
strcpy(DogName, name);
}
Boy::Boy(Boy &b){
BoyName
= b.BoyName;
}
Dog::Dog(Dog &d){
DogName = new char[strlen(d.DogName)+1];
strcpy(DogName, d.DogName);
}
char* Boy::getName(){
return BoyName;
}
char* Dog::getName(){
return DogName;
}
int Boy::modifyName(char name[]){
strncpy(BoyName, name, strlen(BoyName)); //运行时会报错。
return 0;
}
int Dog::modifyName(char name[]){
strncpy(DogName, name, strlen(DogName));
return 0;
}
运行结果