c++析构函数与变量的生存周期实例详解

  

<强>,c++析构函数与变量的生存周期实例详解

  

这篇介绍了析构函数,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些c++知识记不清楚了,它可以帮你很快回忆起来。

  

析构函数(析构函数)的名字与类名相同,但是前面要加“~”。析构函数没有参数和返回值,当然也就不能被重载。

  

<强>何时调用析构函数
  

  

析构函数在对象消亡时自动调用,这是都了解的情况,但是实际上这还隐含的说:函数的参数对象以及作为函数返回值的对象,在消亡时也会引发析构函数调用。

        # include   使用名称空间性病;   类CNum {   公众:   int num;   ~ CNum () {cout & lt; & lt;“破坏者”& lt; & lt;endl;}   CNum () {num=0;cout & lt; & lt;“constractor CNum ()& lt; & lt;endl;}   CNum (CNum,n) {num=n.num;cout & lt; & lt;“constractor CNum (CNum,n)”& lt; & lt;endl;}   };      CNum有趣(CNum n) {   cout & lt; & lt;“有趣的()启动”& lt; & lt;endl;   n。num=3;//这里的修改只是对形参的修改,对实参没影响   返回n;   }      int main () {   CNum n1;   n1=乐趣(n1);   返回0;   }      

<>强运行结果:

  

constractor CNum ()
  constractor CNum (CNum,n)//构造形参n
  有趣的()
  constractor CNum (CNum,n)//构造作为返回值的临时对象
  析构函数//有趣的返回值是一个临时对象,临时对象的生存周期只有一条语句
  析构函数//离开有趣的(),形参n消亡
  析构函数//主要结束时局部变量n1消亡
  

  

请按任意键继续。

  

调用函数时使用传引用而不是直接传递对象,可以省掉很多次不必要的函数调用,特别是这个函数会被频繁调用的时候。

  

<强>虚析构函数

  

析构函数可以是虚函数,但是构造函数不能。(想一想构造函数可以重载,但析构函数不能,这对冤家也算扯平了吧╮(╯▽╰)╭)

  

一般来说,一个类如果定义了虚函数,则最好将析构函数也定义成虚函数。之所以有这样的建议,因为这里容易出现隐蔽的错误。看一段代码:

        类CShape {   公众:~ CShape(){/*什么也不做*/}   };      类CCircle:公共CShape {   公众:   CCircle(){/*这里分配了内存*/}   ~ CCircle(){/*这里释放了内存*/}   };      int main () {   新CCircle CShape * ptrShape=();   删除ptrShape;   返回0;   }      

那么,,删除ptrShape;执行时是执行了哪一个析构函数呢?恰恰不是我们希望调用的~ CCircle(),而是调用了什么都不做的~ CShape()内存泄露了。为了避免发生这种事一般采取的办法就是把析构函数定义成虚函数。也就是虚拟~ CShape(){/*什么都不做*/};,只要基类的析构函数是虚函数,那么派生类的析构函数不论是否用“virtule”关键字声明,都会成为虚析构函数。

  

<强>变量的生存期
  

  

1)全部变量的生存周期是从程序开始到最后,而且是先定义的先产生,后消亡。全局变量的构造函数在进入主要()之前就已经调用,在推出主要()之后才消亡。

  

2)临时对象的生存周期不会大于语句的执行时间。类型转换语句和返回语句等可能会产生临时变量。

  

3)局部变量的生存期是从定义开始到最近的“}”结束

  

4)静态局部变量在第一次执行定义语句时构造产生,在程序的结尾全局变量消亡前消亡。

  

,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

c++析构函数与变量的生存周期实例详解