zoukankan      html  css  js  c++  java
  • C++-初始化表,this指针,常函数,析构函数,拷贝构造,拷贝赋值(day5续)

    四、析构函数(Destructor)

    public:

      ~类名(void){...}//析构函数

    1、析构函数特点

    (1)析构函数是特殊的成员函数,名字“~类名”

    (2)没有返回类型,没有参数,不能被重载(能被重载的充分必要条件是包含参数),一个类只能有一个析构函数

    (3)主要负责清理对象在构造时动态分配的资源

    class Integer{
    
    public:
    
      Integer(int data):m_data(new int(data)){...}//创建对象时会动态分配一块内存
    
      ~Integer(void)(){//对象销毁时自动被调用
    
        delete m_data;
    
        m_data=NULL;
    
      }
    
    private:
    
      int *m_data;
    
    };

    2、析构函数调用

    (1)当对象被销毁时析构函数将自动被调用

        1)栈对象离开作用域时,析构函数被"}"调用

        2)堆对象,被delete或delete[]运算符调用

    (2)当一个类没有定义析构函数,那么编译器将会提供一个缺省的构造函数

        1)对基类类型的成员变量,什么也不做

        2)对 类  类型的成员变量,调用相应的析构函数来析构成员子对象。

    3、对象的创建和销毁的过程

    (1)对象的创建

      分配内存->调用成员子对象的构造函数(多个成员子对象按定义顺序构造)->执行本类的构造函数

    (2)对象销毁

      执行本类析构->调用成员子对象析构—>释放内存

    五、拷贝构造与拷贝赋值

    1、拷贝构造

      如果一个类里面含有动态分配的成员变量时,使用缺省的拷贝构造函数,由于指针指向同一个地址,所以该地址会被delete两次,如下面的m_data。

    class Integer{
    
    public:
    
      Integer(int data):m_data(new int(data)){...}//创建对象时会动态分配一块内存
    
      ~Integer(void)(){//对象销毁时自动被调用
    
        delete m_data;
    
        m_data=NULL;
    
      }
    
    private:
    
      int *m_data;
    
    };

      当使用拷贝构造时,这时缺省的拷贝构造函数拷贝了一个指针,并且和源指针指向同一块地址,这种拷贝叫做浅拷贝。它会导致不同对象的数据共享。即缺省拷贝构造时,拷贝指针为浅拷贝。可能会造成double free异常。

      所以有必要进行深拷贝,即进行数据拷贝,如下:

    Integer (const Integer & that){
    
      m_data=new int;
    
      *m_data=*that.m_data;//或者使用合成一句话写,也可以使用初始化表
    
    }
    
    //不能写成如下这样,否则和缺省的拷贝构造函数一样
    
    Integer(const Integer& that):m_data(that.m_data){
    
    }

    2、拷贝赋值

    假如类String实现了深拷贝构造,构造函数,包含私有字符串指针成员m_str。

    String s1("hello world!");
    
    String s2;
    
    s2=s1;//他会被编译器翻译为s2.operator=(s1);
    //默认的拷贝赋值函数为浅拷贝

    形式:

      类名& operator=(const String& 形参名){}

    注意:

      一般自定义类不写拷贝赋值会有自定义的拷贝赋值函数,但是其他操作符没有

  • 相关阅读:
    Kubernetes日常维护命令
    4-docker的三要素
    3-docker的安装
    2-docker介绍
    1-为什么要使用docker
    块存储、文件存储、对象存储意义及差异
    ceph分布式存储的搭建
    YAML入门:以创建一个Kubernetes deployment为例
    Zabbix通过SQL语句从数据库获取数据说明
    图解HTTP--03--http报文内的信息
  • 原文地址:https://www.cnblogs.com/ptfe/p/11252890.html
Copyright © 2011-2022 走看看