C++-初始化表,this指针,常函数,析构函数,拷贝构造,拷贝赋值
四、析构函数(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){ } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |