Bootstrap

C++类的拷贝(复制)构造函数深入理解

目录

一、拷贝构造函数的基本了解和使用

二、拷贝构造函数的一些注意事项

三、 拷贝构造函数的调用时机

①使用一个对象 “直接构造(显式构造 )” 或 “初始化(隐式构造 )”另一个同类对象

关于拷贝构造函数与赋值函数的区别与联系

②作为函数的形式参数时

 ③作为函数的返回值

 四、深拷贝与浅拷贝的区别与联系

五、总结:拷贝构造函数的难点主要是:


一、拷贝构造函数的基本了解和使用

①拷贝构造函数又被称为复制构造函数,是一种特殊的构造函数,它被/编辑器/在一个对象初始化另一个对象时调用。

②拷贝构造函数的形参列表上需要加上const来防止被引用的对象的值发生改变,不加也可以,但是不加const,会使代码显得不规范。

代码示例:

class Test{
 public:
 /*const 为了防止引用对象被修改
 也可以不写const,而是直接写 Test(Test &obj){}
 但是写const更加规范一些*/
 Test(const Test&obj)//拷贝构造函数无返回值,参数为本类对象的引用。
 {
     //函数体里面一般只写赋值语句。
 }   
}

二、拷贝构造函数的一些注意事项

①拷贝构造可以形成重载,但必须第一个形参为当前类的对象的引用(不建议对其
函数进行加参数重载)。

②如果类设计者没有显式写出拷贝构造函数,编辑器会给出一个默认拷贝构造函数,但是这个默认拷贝构造函数只能够进行浅拷贝的操作,如果类设计者需要进行深拷贝的操作,那么需要自行设计。

三、 拷贝构造函数的调用时机

①使用一个对象 “直接构造(显式构造 )” 或 “初始化(隐式构造 )”另一个同类对象

#include<iostream>

using namespace std;

class test
{
public:
    test() {
        cout << "调用默认构造函数" << " "<<this<<endl;/*利用this指针更清晰的观察编辑器创建对象和析构的具体过程*/
    }
    test(const test& obj)//写const标准一些
    {
        cout << "调用了拷贝构造函数" << " "<<this<<endl;/*一般里面只写赋值语句,但是初学者可以在拷贝构造函数体里面写这条语句以便观察什么时候调用了拷贝构造函数。*/
    }
    ~test() {
        cout << "调用了析构函数" << " "<<this<<endl;
    }
};
int main()
{
    //直接定义obj_1对象,会调用构造函数test()
    test obj_1;
    //用obj_1对象显式构造(直接构造)obj_2对象,会调用拷贝构造函数test(const test& obj)
    test obj_2(obj_1);
    //用obj_1对象隐式构造(初始化)obj_3对象,会调用拷贝构造函数test(const test& obj)
    test obj_3 = obj_1;
    //这里涉及到拷贝构造函数与赋值函数的知识点 
    return 0;
}
;