什么是析构函数

如果说构造函数是对象来到世间的第一声哭泣,那么析构函数就是对象死亡前的最后遗言。

析构函数在对象销毁时会被自动调用,完成的任务是归还系统的资源。

特性:

  1、如果没有自定义的析构函数,则系统自动生成

  2、析构函数在对象销毁时自动调用

  3、析构函数没有返回值、没有参数也不能重载

定义格式

  ~类名()

例如:

class Student
{
public:
Student() {cout<<"Student"<<endl;}
~Student() {cout<<"~Student"<<endl;} // 析构函数不允许加任何参数
private:
string m_strName;
}

定义析构函数的必要性

class Student
{
public:
Student() {m_pName = new char[];}
~Student() {m_pName = new char[20];}
private:
char *m_pName;
}

我们在定义 m_pName 这个变量时,没有用string类型的数组,而是用char类型的指针,并且在函数的定义中,我们把这个指针指向了一个堆中的内存。当这块空间被使用完后,如果没有被释放,那么就会造成内存的泄漏。要释放掉这些内存的最好时机就是在对象被销毁之前。

代码示例

#include <iostream>
#include <stdlib.h>
#include <string>
#include "Teacher.h"
using namespace std; /*************************************************************************
Teacher类
自定义析构函数
普通方式实例化对象,在销毁对象时是否自动调用析构函数
通过拷贝构造函数实例化对象,在销毁对象时是否自动调用析构函数 数据成员:
姓名
年龄 成员函数:
数据成员的封装函数 *************************************************************************/
class Teacher
{
public:
// 声明构造函数,参数给定默认值
Teacher(string name = "cjj",int age = ); // 声明拷贝构造函数
Teacher(const Teacher &tea); // 声明析构函数
~Teacher(); // 声明成员函数,把所有的成员函数都罗列出来
void setName(string _name);
string getName();
void setAge(int _age);
int getAge(); private:
string m_strName;
int m_iAge; }; // 定义构造函数,使用初始化列表,初始化构造函数的参数
Teacher::Teacher(string name,int age):m_strName(name),m_iAge(age)
{
cout << "Teacher(string name,int age)" << endl;
}
// 定义拷贝构造函数
Teacher::Teacher(const Teacher &tea)
{
cout<<"Teacher::Teacher(const Teacher &tea)"<<endl;
}
// 定义析构函数
Teacher::~Teacher(){cout<<"证明析构函数被调用"<<endl;} // 类外定义,写出成员函数的函数体
void Teacher::setName(string _name)
{
m_strName = _name;
}
string Teacher::getName()
{
return m_strName;
}
void Teacher::setAge(int _age)
{
m_iAge = _age;
}
int Teacher::getAge()
{
return m_iAge;
} int main(void)
{
Teacher t1; // 从栈中实例化对象
Teacher *p = new Teacher(); // 从堆中实例化对象
delete p;
Teacher t2(t1); system("pause");
return ;
}

C++ 构造函数_析构函数的更多相关文章

  1. C++_构造函数与析构函数

    构造函数与析构函数 OOP第二课 1 构造函数 1.1 构造函数具有一些特殊的性质 1.2 定义构造函数的一般形式 1.3 利用构造函数创建对象 2 成员初始化表 3 缺省参数的构造函数 4 重载构造 ...

  2. .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]

    构造函数.析构函数 构造函数: 语法: //无参的构造函数 [访问修饰符] 函数名() :函数名必须与类名相同. //有参的构造函数 [访问修饰符] 函数名(参数列表):函数名必须与类名相同. 作用: ...

  3. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  4. C++构造函数、析构函数与抛出异常

    [本文链接] http://www.cnblogs.com/hellogiser/p/constructor-destructor-exceptions.html [问题] 构造函数可以抛出异常么?析 ...

  5. python中的构造函数和析构函数

    python中的特殊方法,其中两个,构造函数和析构函数的作用: 比说“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这 ...

  6. 内存的分配VS回收&构造函数VS析构函数

    之前有一个问题一直困扰着我,就是一个变量出了作用域,我以为这个变量的内存就被回收了,其实不是这样的,昨天问了一个高手,才豁然开朗,自己在看相关代码的反汇编代码,才知道原来真是这样就.这个问题,我想简单 ...

  7. C++C++中构造函数与析构函数的调用顺序

    http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2 ...

  8. php 的 构造函数 和 析构函数

    构造函数 在C++ java里的应用及其普遍,今天好好研究了一下 php 的 构造函数 和 析构函数 构造函数 和 析构函数 构造函数 void __construct ([ mixed $args ...

  9. C++-理解构造函数、析构函数执行顺序

    先初始化序列中的函数调用,如果基类构造函数为非引用传递,则引起参数的拷贝构造 再: 先类内的成员构造函数(拷贝/默认),再类的构造函数:先基类,再派生类: 本文主要说明对象创建时构造函数的执行顺序,对 ...

随机推荐

  1. JavaScript常见算法——去重

    刚才看到一篇博文,数组去重的,我先试着写一下:新建一个空数组,对原数组进行for循环,对新数组使用indexOf方法判断新数组中是否有该数组元素,没有的话就加入新数组.后来看文中使用的是HashTab ...

  2. p4c-bm安装

    Generates the JSON configuration for the behavioral-model (bmv2).它是用来形成 行为模型BMV2 的 JSON配置 的. Importa ...

  3. node 常用指令 node 扩展链接

    node -v       node 版本 npm -v     npm版本号,npm是在安装nodejs时一同安装的nodejs包管理器  (注册.安装模块,和小乌龟有点像) npm list  当 ...

  4. Android多个Module统一配置相同jar或库的版本号

    Android Studio多个Module依赖相同的库时对版本号进行统一配置 在Android项目中,一个项目经常会依赖其他的一个甚至多个库文件,在这种依赖的时候最常见的一个错误就是 jar包版本不 ...

  5. vue 报错 Cannot read property '__ob__' of undefined的解决方法

    记不清第n次遇到这个错误了,但是脑子就是不好用,记不住解决办法啊,每次都要找好久才能找到错误,网上还一篇篇的全是错误答案......所以写篇随笔,记录下,方便大家也方便我自己. 网上有人说是组件循环了 ...

  6. 谈谈oracle里的join、left join、right join

    create table l as select 'left_1' as str,'1' as v from dual union allselect 'left_2' ,'2' as v from ...

  7. 个人知识管理系统Version1.0开发记录(07)

    模 块 复 用 原本还要测试一会的,突然出现一连串诡异的问题,比如,编译少加载个类啊,输入地址少个字母啊,改几行代码一改就是半小时啊.这是在提醒我们大脑疲倦了,所以果断小结,下次继续.这一次简单完成了 ...

  8. 浅析parseInt与parseFloat的区别

    parsetInt与parseFloat的区别还是很大的,简单来说,parseInt解析字符串为整数,parseFloat解析字符串为小数. 首先说parseInt() 1.可以接受两个参数,第一个为 ...

  9. 将java打jar包成linux后台服务service

    将java打jar包成linux后台服务service 第一步:将java程序打成jar包 build.gradle配置文件中加spring-boot-gradle-plugin插件,具体配置如下(配 ...

  10. sgu 147. Black-white king 思路 坑 难度:1

    147. Black-white king time limit per test: 0.25 sec.memory limit per test: 4096 KB input: standard i ...