美文网首页
浅谈拷贝构造与赋值重载

浅谈拷贝构造与赋值重载

作者: 404Not_Found | 来源:发表于2021-09-13 23:59 被阅读0次
  • 作者: 雪山肥鱼
  • 时间:20210914 23:45
  • 目的: 浅谈拷贝构造与赋值重载

无拷贝构造与赋值

namespace sp1
{
    //默认 复制
    //如果不写 拷贝,编译器也会有默认的对象拷贝和对象赋值行为
    class A
    {
    public:
        int m_i, m_j;
    };
    void fun()
    {
        A aobj;
        aobj.m_i = 15;
        aobj.m_j = 16;

        A aobj2 = aobj;//执行拷贝,写了 才执行 ,不写 按位复制

        A aobj3;
        aobj3.m_i = 13;
        aobj3.m_j = 14;
    
        aobj2 = aobj3;//operator = ,写了才用
    }
}

如同注释所说:
不写的话,会安位赋值。自由度低,遇到new,指针等会凉。会造成多次析构等危险。

有拷贝与赋值

namespace sp2
{
    class A
    {
    public:
        int m_i, m_j;

        A & operator=(const A & tmp)
        {
            m_i = tmp.m_i;
            m_j = tmp.m_j;
            return *this;
        }

        A(const A & tmp)
        {
            m_i = tmp.m_i;
            m_j = tmp.m_j;
        }
        A()
        {

        }
    };
    void fun()
    {
        A aobj;
        aobj.m_i = 15;
        aobj.m_j = 16;

        A aobj2 = aobj;//拷贝

        A aobj3;
        aobj3.m_i = 13;
        aobj3.m_j = 14;
    
        aobj2 = aobj3;//operator = ,

    }
}

拷贝构造函数 和 赋值运算符重载只要写了,就会让位赋值失效,所以负起责任来,写全。

如何禁止拷贝与赋值

将这两个函数private 私有化即可。

析构函数的生成时机

析构函数并不会自动生成

  • 继承基类,当基类有析构函数,则子类会自动生成一个析构函数,因为父类的析构函数要被调用
  • 类的成员有对象,也会自动合成析构函数
  • 析构函数何时被扩展
    • 类成员是对象,并且类成员带析构函数,编译器会扩展,自动填充汇编代码去调用成员对象的析构函数
      • 顺序与构造相反,优先析构类成员,再调本类的析构函数
    • 继承基类,基类带析构函数,无论是虚析构还是正常,也会自动扩展,也与构造相反,先调用子类的析构函数,再调用父类的析构。
  • 虚基类,放弃把,有点恶心。

相关文章

网友评论

      本文标题:浅谈拷贝构造与赋值重载

      本文链接:https://www.haomeiwen.com/subject/ryahgltx.html