C++学习笔记 第十九课 深拷贝

怎甘沉沦 提交于 2020-02-24 14:26:50

学习笔记内容来自:狄泰软件学院 唐佐林老师 的视频,十分感谢您的指导

特殊的构造函数

无参构造函数
当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且函数体为空

拷贝构造函数
当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制

所以,下列定义的类并不是空的,因为有隐藏的默认提供的无参构造函数和拷贝构造函数
class Test{};

初始化和赋值

在C++中,初始化和赋值不一样,初始化会触发构造函数,而赋值不会

拷贝构造函数

1.格式:claas_name(const class_name& another){}
2.意义:兼容C语言的初始化方式

拷贝构造函数中的深拷贝和浅拷贝

1.浅拷贝:拷贝后对象的物理状态相同
2.深拷贝:拷贝后对象的逻辑状态相同

PS:编译器提供的拷贝构造函数只进行浅拷贝

什么时候需要进行深拷贝

1.对象中有成员指代了系统中的资源
2.成员指向了动态内存空间
3.成员打开了外存中的文件
4.成员使用了系统中的端口
5…

示例程序:

class Array
{
private:
    int* m_data;
    int m_length;
public:
    Array()
    {
        data = new int[5];
    }
    
    Array(const Array& another)
    {
        /*
         * 浅拷贝:
         * this->m_data = another.m_data;
         * this->length = another.length;
         * 
         * 深拷贝:
         * 
         * this->m_data = new int[5];
         * this->length = another.length;
       */
    }
    
    ~Array()
    {
        delete[] this->m_data;
    }
};

不进行深拷贝的话,析构的时候会发生重复释放同一片内存空间,会段错误

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!