C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C++-初始化表,this指针,常函数,析构函数,拷贝构造,拷贝赋值(day5续)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_674_0@
@H_674_0@

四、析构函数(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 *@H_682_22@m_data;

};@H_772_58@ 

 

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 *@H_682_22@m_data;

};@H_772_58@ 

 

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

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

Integer (const Integer & that){

  m_data=new int;

  *m_data=*that.m_data;//或者使用合成一句话写,也可以使用初始化表

}

//不能写成如下这样,否则和缺省的拷贝构造函数一样

Integer(const Integer& that):m_data(that.m_data){

}@H_772_58@ 
@H_674_0@

大佬总结

以上是大佬教程为你收集整理的C++-初始化表,this指针,常函数,析构函数,拷贝构造,拷贝赋值(day5续)全部内容,希望文章能够帮你解决C++-初始化表,this指针,常函数,析构函数,拷贝构造,拷贝赋值(day5续)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:5c++dayday5函数初始化拷贝指针构造赋值
猜你在找的C&C++相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap