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,必须用,待续

浙公网安备 33010602011771号