C++ 复制构造函数和赋值运算符重载函数

时间:2021-07-04 19:25:48
声明一个空的类testsize,sizeof(testsize)为1,为其声明构造函数和析构函数,依旧为1
构造函数不能使用关键字virtual,析构函数可以
一旦类中存在虚函数,就会为该类生成虚函数表,并在每一个实例中添加一个指向虚函数表的指针,从而大小为一个指针大小,32位机器上为4,64位机器上为8

复制构造函数
    1. 调用时机:在三种情况下会调用复制构造函数
    1) 一个对象作为函数参数,以值传递的方式传入函数体
             从而唯一的形参必须是引用,否则在复制函数内容调用复制构造函数,会造成永无休止的递归调用从而导致栈溢出
            比如类A的复制构造函数A(A a){}; 这样的形式是错的
    2) 一个对象作为函数返回值,以值传递的方式从函数返回
    3) 一个对象用于给另外一个对象进行初始化
    2. 默认复制构造函数:编译器会自动生成一个复制构造函数,但是只对普通成员进行赋值处理,对于静态数据成员和动态成员没有进行处理
    3. 浅复制和深复制
    1) 浅复制:在对象复制时,只对对象中的数据成员进行简单的赋值,默认的复制构造函数就是浅复制
    2) 深复制:在静态数据成员和动态成员的处理,必须定义自己的构造函数,进行处理
            比如动态成员指针,必须为其分配一个新的地址,并将该地址的值初始化;没有进行这一步处理的话,两个对象释放的时候若析构函数有显式释放指针空间,则释放同一个指针,会报错

赋值运算符重载函数
    注意点:
    1) 返回值类型为该类型的引用 【保证连续赋值】
    2) 传入的参数的类型声明为常量引用
    3) 实例自身已有的内存管理 【存在动态数据成员的话】
    4) 需要判断传入的参数和当前实例是否同一个实例 【通过地址判断】,是的话则直接返回
     C++ 复制构造函数和赋值运算符重载函数C++ 复制构造函数和赋值运算符重载函数
    上面这段代码考虑到了所提到的四个方面,但缺乏安全考虑;如果释放了自身内存后,new分配新的空间时内存不足抛出错误,此时原先的实例不再保持有效的状态;像下面这种方法,创建一个 临时实例,则保证了安全性,同时交换指针也保证了原实例的空间能被释放
     C++ 复制构造函数和赋值运算符重载函数C++ 复制构造函数和赋值运算符重载函数