1、什么是析构方法?

  析构方法与构造方法互补。

2、为什么设计析构方法?

  构造方法创建一个对象,对象内部往往还会申请一些资源。设计析构方法的目的是 释放资源,同时销毁自身。

3、析构方法可以认为分为两个:显式析构方法和合成析构方法。

  显式析构方法用于:释放对象申请的资源,也就是指针指向的对象。

  合成析构方法用于:销毁自身,对于对象的每一个数据成员(不包括继承的数据成员),进行析构。继承的数据成员通过父类的合成析构方法进行析构。

4、即使编写了显示析构方法,合成析构方法仍然会运行。首先使用显式析构方法释放资源,再调用合成析构方法销毁自身。

5、如果对象没有申请资源,显式析构方法不需要做任何事,也就不需要编写显式析构方法。

6、构造析构的顺序:父类构造方法初始化对象的父类部分,子类构造方法初始化对象的子类部分。子类合成析构方法销毁对象的子类部分,父类合成析构方法销毁对象的父类部分。

7、显示析构方法会影响到合成析构方法的调用,调用当前类的显式析构方法,就会调用当前类的合成析构方法,销毁对象的自身部分,再调用父类的合成析构方法,销毁对象的父类部分。

8、一个类作为父类,他的析构方法必须是virtual,为什么?

  考虑,父类的显式析构方法是non-virtual,父类指针指向子类对象,delete父类指针。过程是:调用父类的显式析构方法,调用父类的合成析构方法,只销毁对象的父类部分,导致诡异的部分销毁对象。

  如果父类的显式析构方法是virtual,调用子类的显式析构方法,调用子类的合成析构方法,销毁子类部分,调用父类的合成析构方法,销毁父类部分。

9、显式析构方法没有形参,没有返回值,因此,不能过载。

10、什么情况下,执行析构方法?

  a、对象离开生存空间,也就是超出作用域。

  b、使用delete指针

  c、程序异常,栈展开的时候

11、显式析构方法和合成析构方法都是隐式调用的,合成析构方法就是对自身包含的每一个对象,进行析构。

C++ 析构方法的更多相关文章

  1. php构造方法与析构方法

    1. 构造方法 <?php //构造方法 __construct() 是在实例化对象时被自动调用 //用途:可以用于初始化程序(可以给成员属性赋值,也可以调用成员方法) //语法:[修饰符] f ...

  2. 【Swift学习】Swift编程之旅---析构方法(十九)

    在一个类的实例内存被释放之前,析构方法被立即调用.使用deinit关键字来声明析构方法,类似于构造方法用init来声明.析构方法只适用于类类型.   析构方法原理 Swift会自动释放不再需要的实例以 ...

  3. 【PHP构造方法和析构方法的使用】

    构造方法:__construct,析构方法:__destruct 代码示例: <?php class Person { public $name; public $age; public fun ...

  4. PHP-----类与对象,成员方法,成员属性,构造方法,析构方法

    php里面的类-----class XX{},通过类的定义,可以使用调用类里面的成员属性和成员方法. 对象---一个类就是一个对象,一个对象可以有多个属性,一个类可以有多个成员方法. 构造方法:一个类 ...

  5. PHP其它常用函数;<<<面向对象(OPP)的三大特性:封装、继承、加态:>>> <----面试题 ;构造方法、析构方法,魔术方法、set、get方法;静态;抽象类;接口

    PHP其它常用函数:     赋值:$r->name = "元素";      取值: echo $r->name;  count()   计算数组中的元素数目或对象中 ...

  6. 【M11】禁止异常流出析构方法之外

    1.在两种情况下,调用析构方法:a.在正常状态下被销毁,栈上的对象离开作用域或者堆上的对象执行delete:b.抛出异常,堆栈回滚,栈上已经构造好的对象,也就是抛出异常之前的代码,自动调用析构方法.注 ...

  7. 【07】为多态基类声明virtual析构方法

    1.考虑下面的需要,需要一个工厂方法.工厂方法的规则是:在堆上分配一个子类对象,并返回父类指针.使用完毕,delete父类指针.如果父类的析构方法不是virtual,将直接调用父类的析构方法,导致局部 ...

  8. PHP面向对象的构造方法与析构方法

    构造方法与析构方法是对象中的两个特殊方法,它们都与对象的生命周期有关.构造方法时对象创建完成后第一个被对象自动调用的方法,这是我们在对象中使用构造方法的原因.而析构方法时对象在销毁之前最后一个被对象自 ...

  9. swift3.0 构造器、析构方法(3)

    构造和析构是两种特殊的方法,在对象进行初始化的时候 使用构造,在对象的释放操作中,使用析构. 构造器的定义: init (){ //代码 } init(name:String){ //代码 } 在构造 ...

随机推荐

  1. iOS - 操作文件目录的方法

    转:http://blog.csdn.net/marujunyy/article/details/11579183 使用目录的常用方法: //获取当前目录 - (NSString *)currentD ...

  2. Zend Framework 入门(1)—快速上手

    1. 安装 从 Zend Framework 的网页上下载最新版本.解压后,把整个目录拷贝到一个理想的地方,比如:/php/library/Zend. 打开 php.ini 文件,确认包含 Zend ...

  3. 《C++ primer》--第7章

    删除指针后,该指针就变成了悬垂指针.悬垂指针指向曾经存放对象的内存,但该对象已经不再存在了. 习题7.8 举一个例子说明什么时候应该将形参定义为引用类型.再举一个例子说明什么时候不应该将形参定义为引用 ...

  4. linux 安装jdk 配置tomcat

    Linux(ubuntu)下安装JDK.Tomcat 一.安装jdk 1)首先以root用户登录进去,在根目录下建立/usr/java的目录,我们将下载的东西都放到该目录下去. 2)参考的https: ...

  5. HDU 5001-Walk(概率dp)

    题意: 给你一个图,求在长度为d的所有路径,不经过每个结点的概率 分析: 枚举每个结点,正推求概率 #include <map> #include <set> #include ...

  6. LoadRunner学习记录--Flights打开空白页的问题

    从网上查了一下,原因是PERL5LIB这个环境变量的原因. 担心修改环境变量会影响ORACLE的运行 在WebTour中修改run.bat   增加 set PERL5LIB=D:\oracle\pr ...

  7. Modules-nodejs

    Modules Node有一个简易的模块加载系统.在node中,文件和模块是一一对应的.下面示例是foo.js加载同一目录下的circle.js. foo.js的内容: var circle = re ...

  8. leetcode@ [354] Russian Doll Envelopes (Dynamic Programming)

    https://leetcode.com/problems/russian-doll-envelopes/ You have a number of envelopes with widths and ...

  9. Type datetime2 is not a defined system type - Entity Framework 摘自网络

    "Type datetime2 is not a defined system type" Solution: 把edmx 改为 ProviderManifestToken=&qu ...

  10. 第二百五十一天 how can I 坚持

    hadoop,namenote和datanode.namenode如果要是在启动时加载到内存,会不会对内存的要求比较高呢. edits-->fsimage. secondnamenode,那么n ...