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. TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议

    把这三个协议放到一起学习是因为这三个协议处于同一层,ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP得到要传输的数 ...

  2. js把div固定在页面的右下角

    在公司做材料系统中,需要做一个总是居于右下角的div,但是因为右边这部分本就是用iframe做的,所以是不好弄的. 一开始,以为用position:fixed,一句css就可以完成,结果在iframe ...

  3. dell optiplex台式机 安装win7 清楚分区的方法

    http://jingyan.baidu.com/article/92255446e1065f851648f42b.html

  4. HDU 4035Maze(树状+概率dp,绝对经典)

    题意: 给你n个节点的树,从1节点开始走,到每个节点都有三种情况,被杀死回到1节点,找到隐藏的出口出去,沿着当前节点相邻的边走到下一个节点,给出每个节点三种情况发生的概率分别为ki,ei,1-ki-e ...

  5. QT4.7.4-vs2008和vs2010的安装并编写测试程序

    QT的安装着实费了我好大的劲,之前试过QT5.1.0与VS2010的安装,但是因为设置的地方太多,程序运行总是不成功,所以最后选用QT4.7.4和VS2008与VS2010来编写程序.写这篇文章来总结 ...

  6. DX11&C++

  7. cxf 动态创建客户端,局域网能正常调用服务端,外网不能访问

  8. 树莓派I2C连接18B20

    按图连接设备 载入模块 sudo modprobe w1-gpio sudo modprobe w1-therm cd /sys/bus/w1/devices/ 显示结果 ls pi@raspberr ...

  9. Eclipse与tomcat服务器建立关联

    首先,点击 打开preference,打开如下界面 点击ADD,进入如下界面,选择tomcat服务器的版本->点击next 进入如下界面,Name:服务器名字,directory:服务器目录 补 ...

  10. Java8新特性 1——利用流和Lambda表达式操作集合

    Java8中可以用简洁的代码来操作集合,比如List,Map,他们的实现ArrayList.以此来实现Java8的充分利用CPU的目标. 流和Lambda表达式都是Java8中的新特性.流可以实现对集 ...