c++ 复制构造函数,深复制,浅复制

1,复制构造函数

复制构造函数用于将一个对象复制到新创建的对象中。它是用于初始化过程(包括按值传递对象,函数返回对象),而不是常规的赋值过程。注意初始化与赋值的区别??

编译器自动生成的复制构造函数====隐式(默认)的复制构造函数。

如果我们没有定义复制构造函数,编译器将自动生成复制构造函数,默认的复制构造函数逐个复制非静态成员,也就是成员复制,这也是所谓的浅复制(只复制对象成员,而不进行更深层次的复制,比如只复制指针成员,而不是复制指针成员指向的内存中的数据)

复制构造函数何时调用?有何功能?

新建一个对象并将其初始化为同类现有对象时,复制构造函数都将被调用。

调用场合:

1,新建一个对象并将其初始化为同类已有对象时。e.g:

string Name("kobe");//调用string(const char *)创建一个对象,并初始化为参数值。

 

string Laker = Name;//

string Laker = String(Name);//

上面两句作用相同,c++允许编译器使用两种方式来解释这两条语句:

  一种是调用复制构造函数string(const string &)创建一个临时对象,然后通过复制运算符将临时对象的值赋值给Laker。 一种是直接使用复制构造函数来创建Laker,与下面一条语句类似,效率更高,内存占用更少。

string Laker(Name);//直接使用复制构造函数创建Laker对象。

2,当按值传递对象时或者函数返回一个对象时。

当函数按值传递对象或函数返回对象而非对象的引用时。都将调用复制构造函数。

fun(string a);

string fun();注意这是声明了函数头,并不是使用默认构造函数创建了fun对象,使用默认构造函数创建对象的几种方式:

string A;

string *A = new string()或 string *A = new string;

string A = string();

string A();//no,这是一个函数声明。

3,当创建一个临时对象时,可能调用复制构造函数。

  按值传递对象和返回对象而非引用将调用复制构造函数,因此应该返回引用或按引用传递对象,这将节省调用构造函数的空间和存储对象的空间。

  如果成员本身就是类对象,这将使用这个类的复制构造函数来复制对象成员

 

什么时候需要用复制构造函数进行深度复制???

在类声明中包含用new初始化的指针时需要定义一个复制构造函数进行深度复制,以复制指针指向的数据,而不是指针,这称为深度复制,复制的另一种形式(成员复制或浅复制)只复制指针值。

 

在构造函数中使用new初始化指针时应该注意的事项:

   1,如果在构造函数中使用new来初始化指针,则在析构函数中使用delete来释放

   2,必须用,待续

posted @ 2016-05-30 13:53  ForAnything  阅读(289)  评论(0)    收藏  举报