上章刚说到构造函数的一些基本用法,或许有人也会对取反的析构函数抱有疑问,这个函数有什么用呢?
析构函数的作用:当某个对象销毁时,执行一些特定的操作。比方说:指针成员占用的内存空间。
当然文字理解是个问题,很难解释地通,首先看下代码实现,前面已经看过初始化对象的操作了,今天再看另一种方式初始化对象,代码如下:
Father.h:

#pragma once
class Father
{//公共的行为或者属性(变量)
public://自定义构造函数Father();//自定义析构函数~Father();                        //受保护的行为或者属性(变量)
protected://私有的行为胡总和属性(变量)
private:
};

Father.cpp:

#include "Father.h"
#include <iostream>           //标准库输入、输出
using namespace std;        //使用所有的std::函数 命名空间
Father::Father()
{cout << "Father 构造函数" << endl;
}
//自定义析构函数
Father::~Father()
{cout << "Father 析构函数。" << endl;
}

类的使用.cpp:

#include <iostream>        //C++标准库,输入、输出
using namespace std;    //使用std命名空间[所有的std::]
#include "Father.h"       //自定义class 类头文件int main()
{//实例化对象(指针)Father* father = new Father;if (father){delete father;}system("pause");            //暂缓功能,能让界面停留的功能return 0;
}

运行的效果图如下:

这就看出,用到new的方式创建对象必须要释放掉。当Father这个对象用完,再被释放后,编译器竟然帮我们调用了析构函数,也能看出一丝端倪(构造函数和析构函数的运行顺序),这说明:对象被销毁后,析构函数才能被调用。
下面我们在看看成员占用内存空间是咋回事。
Father.h:

class Father
{//公共的行为或者属性(变量)
public://自定义带参构造函数,初始化Father();//自定义的函数,只为申请m_Name内存空间char* GetMemory(int num);//析构函数~Father();                       //受保护的行为或者属性(变量)
protected://私有的行为胡总和属性(变量)
private:char*       m_Name;             //自定义char数据类型的指针变量
};

Father.cpp:

#include "Father.h"
#include <iostream>           //标准库输入、输出
using namespace std;        //使用所有的std::函数 命名空间
Father::Father()
{cout << "Father 构造函数" << endl;//申请成员属性m_Name内存空间this->m_Name = this->GetMemory(100);//拷贝函数,将VisiousDragon拷贝到类成员属性m_Name中strcpy(this->m_Name,"VisiousDragon");//输出,查看for (size_t i = 0; i < 14; i++){cout << *(this->m_Name + i) << "\t";}cout << endl;
}
//自定义析构函数
Father::~Father()
{cout << "Father 析构函数。" << endl;if (this->m_Name != NULL){free(this->m_Name);}
}//申请m_Name内存空间
char* Father::GetMemory(int num)
{//申请内存空间this->m_Name = (char *)malloc(sizeof(char) * num);return this->m_Name;
}

知识点:
malloc()申请的内存空间,释放时与free()相对。
new 数据类型 创建的对象,释放时与delete、delete[ ]相对。
类的使用.cpp:

int main()
{Father* father = new Father;if (father){delete father;}system("pause");         //暂缓功能,能让界面停留的功能return 0;
}

输出的结果:

错误的原因不是代码的问题,而是strcpy这个函数在高版本中属于不安全的,要用strcpy_s()替代。
如果不会用strcpy_s(),也没关系,在Father.cpp文件上添加一句声明:

//声明,用来
#define _CRT_SECURE_NO_WARNINGS
#include "Father.h"
#include <iostream>           //标准库输入、输出
using namespace std;        //使用所有的std::函数 命名空间
.........

再次运行的结果如下:

条条代码铸前程,行行字母显乾坤。你的路上不孤单,一路陪行。
CSDN:此处不归牛顿管(VS中设置#define _CRT_SECURE_NO_WARNINGS的两种方式)
博客园:puyangsky(原博客地址>>>>析构函数)
CSDN:keneyr(析构函数)

C++:类的使用【析构函数】相关推荐

  1. 多态基类与虚析构函数

    假设我们有一个基类A,很不幸的,A的析构函数是一个non-virtual.同时我们有一个派生类B,它派生自A. 我们定义了一个A类型指针,它指向的实际对象是B: A * ptr = new B; 然后 ...

  2. 基类的析构函数不能被继承。_为什么要把C++类中的析构函数声明为虚函数?

    如题,当一个类为基类的时候,通常其析构函数被声明为虚函数,这是为啥? class BaseCls { public: BaseCls() { printf("BaseCls()n" ...

  3. boost::signals2模块实现为类定义预析构函数的最小示例的测试程序

    boost::signals2模块实现为类定义预析构函数的最小示例的测试程序 实现功能 C++实现代码 实现功能 boost::signals2模块实现为类定义预析构函数的最小示例的测试程序 C++实 ...

  4. C++学习笔记-----存在多态调用时,为基类定义虚析构函数

    在C++的继承体系中,构造函数和析构函数的执行顺序是完全相反的. 对于构造函数:从继承体系的最顶层的基类开始,一步步往下构建.即构造顺序是  基类--->>派生类. 对于析构函数:从继承体 ...

  5. 条款七 为多态基类声明virtual析构函数

    1.如果基类中的成员函数是virtual类型的,其继承类中相应的函数也是virtual类型,并且基类对象的引用指向继承类对象时, 基类就可以调用继承类函数,否则调用的是基类函数 class base ...

  6. C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765

    https://www.zhihu.com/question/30838092/answer/49623765 C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? 代码如下 ...

  7. 派生类构造函数和析构函数的执行顺序

    派生类继承了基类的成员,实现了代码的重复利用,但基类的构造函数和析构函数不能被继承.如果在派生类中需要对新增加的成员进行初始化,则需要加入派生类的构造函数.同样派生类也需要添加析构函数来实现一些结束工 ...

  8. C++类构造函数与析构函数

    C++类的构造函数和析构函数 一.构造函数 构造函数在类的对象被创建时,自己调用,不可以显式调用.通常用构造函数来做一些初始化的工作. 构造函数又分为两类: 1. 无参数的构造函数2. 带参数的构造函 ...

  9. 读书笔记_Effective_C++_条款七:为多态基类声明virtual析构函数

    严格来说,多态分为编译时多态和运行时多态,编译时多态是函数的重载,而运行时多态则是迟绑定技术,即根据基类指针或引用的实际指向来决定采取何种行动,一般来说,多态特指运行时多态.下面我们来举有关C++多态 ...

  10. Effective C++条款7:为多态基类声明virtual析构函数

    要点: 带多态性质的基类或者class中有virtual函数,就应该将析构函数声明为virtual,例如 class TimeKeeper { public:TimeKeeper();~TimeKee ...

最新文章

  1. 马尔科夫决策过程基本概念详解
  2. linu怎么启动oracle,请问该如何在LINUX下启动ORACLE?
  3. oracle中代替in 和not in 高效方法
  4. 利用angular4和nodejs-express构建一个简单的网站(六)—用户模块和路由分析
  5. 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集...
  6. 图解cacti简单使用
  7. feign post 传递空值_听我讲完GET、POST原理,面试官给我倒了杯卡布奇诺
  8. jquery li ul 伪分页_求教关于Jquery的ul li的分页,该怎么处理
  9. 漫话:如何给女朋友解释什么是2PC(二阶段提交)?
  10. uniapp image图片切换动效_动效设计从概念到落地
  11. 网络配置_CentOS8 网络配置
  12. 编辑WCF配置不出现
  13. 为什么 Eureka 比 ZooKeeper 更适合做注册中心?
  14. Linux 下查看sqlite文件
  15. 城市应急指挥系统详情分析及建设方案概述
  16. 计算机最早应用于( )领域,计算机最早被应用于()领域。
  17. 新浪微博批量删除微博的方法
  18. 【iOS】UI基础Day2-笔记(毛玻璃、帧动画、音效等)
  19. gis坐标|度分秒与十进制转换公式
  20. 四川大学计算机博士申请考核条件,四川大学2020年博士招生章程发布!招1650人!...

热门文章

  1. 双流电子计算机学校,成都市计算机电子信息学校2021年招生简介
  2. Dreamweaver PHP动态网站开发从入门到精通pdf
  3. 什么玩意?快读快写浮点型数据?
  4. 黑马程序员iOS10.0新课程与苹果发布会在9月8号同步发布
  5. vue多选、全选和选中删除问题
  6. java9 钻石操作符
  7. Google Earth Engine(GEE) ——多种机器学习方法(随机森林、cart、svm等)进行土地分类(安第斯高原为例)用光谱指数、植被、土壤、雪和烧毁区以及地形指数构建模型
  8. C#自作lol登陆界面(功能:连接sql数据库,注册,登陆,修改密码。)
  9. 日本留学生独立能力的重要性
  10. 数据库系统之sql语言