当前课程知识点:VC++面向对象与可视化程序设计(下):MFC编程基础 > 第6章 MFC基础知识 > 6-2 C++的基本知识 > 6-2-5 构造函数和析构函数
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频列表
我们开始来介绍构造函数和析构函数
C++中有几类特殊的函数
这些函数决定了如何建立、初始化、拷贝及删除对象
构造函数和析构函数是其中最重要的两种
和一般的成员函数一样
构造函数和析构函数既可以在类的内部声明和定义
也可以在类的内部声明
在类的外部定义
如果一个类含有构造函数
则在建立该类的对象时就要调用它
而如果一个类含有析构函数
则在销毁该类的对象时调用它
那首先我们来了解一下构造函数
对象在生成过程中通常需要初始化变量
或分配动态的内存
以便我们能够操作
或者防止在执行过程中返回意外结果
构造函数是一种特殊的成员函数
它主要用来为对象分配内存空间
对类的数据成员进行初始化
并执行对象的其他内部管理操作
构造函数的特点是
构造函数的名字和它所在的类的名字相同
这点很重要
一下就能够识别出这个函数是不是构造函数
因为构造函数的名字和它所在的类的名字是一样的
当定义该类的对象时
构造函数完成对此对象的初始化
构造函数它可以接收参数并允许重载
好了我们这里又出现了新的名词叫“重载”
关于重载的问题
我们后面会介绍
当一个类含有多个构造函数时
编译程序为了确定调用哪一个构造函数
需要把对象中使用的参数
和构造函数的参数表进行比较
这个过程与在普通的函数重载中进行选择的过程相同
大家来看一下这个例子
定义了一个class CRectangle
定义了私有的宽度和高度
定义了这个
这个就是大家看到的这个函数的名字
跟类的名字一样
说明这个函数
然后在这里面定义了一个area
同样直接有函数体在里面
这实际上是内联函数
那这个构造函数的定义在哪儿呢
我们看在后面
这个前面是类名
后面这个是构造函数的函数名
因为它呢
两个名字是一样的
当中用双冒号分隔
这个大家已经很熟悉了
然后a和b分别赋给width和height
在主函数里面我们仍然是定义了rect
这个CRectangle的对象
然后把5和6分别赋给a和b
实际上就是赋给了width和height
然后在执行rect.area这个函数的时候
求出了width和height相乘的积
所以它的值也是30
那这个例子跟前面例子不一样的地方就是
定义了一个构造函数
程序一运行就初始化它
这就是构造函数的使用
那这里面大家看得很清楚了
构造函数的名字和它所在的类的名字相同
关于构造函数有几个问题要跟大家讨论一下
第一
构造函数跟普通函数一样也可以有参数
但不能有返回值
这是因为构造函数通常是在定义一个新的对象时调用
它无法检查构造函数的返回值
第二
在实际应用中
如果没有给类定义构造函数
则编译系统将为这个类生成一个缺省的构造函数
该缺省的构造函数没有参数
只是简单地把对象中的每一个实例变量初始化为0
第三
构造函数可以有缺省的参数
大家看下面的程序段
就体现了构造函数的缺省参数问题
大家看下面定义了一个类叫My_class
它的构造函数也叫My_class
因为要跟类的名字一样
但构造函数里面直接给了float x=3.5
实际上就是在构造函数的定义中带了缺省的参数x和y
第四
构造函数也可以没有参数
比如下面定义的类My_class中的构造函数就没有参数
大家看My_class这里是空的括号
没有参数
该类的构造函数执行的功能
大家看在屏幕上显示的是NO PARAMETER这么一句话
我们来看一下代码
在这个类里面定义了构造函数My_class
My_class它执行的过程就是cout输出NO PARAMETER
那谁在调My_class呢?
我们在主函数里面调用了My_class
所以程序一运行就调用它
输出的是NO PARAMETER
这个时候大家看到My_class这个构造函数这个括号是空的
没有参数
这也就是说构造函数也可以没有参数
我们接着来了解一下析构函数
析构函数也是类中的特殊成员函数
与定义它的类具有相同的名字
那大家说了那构造函数的名字跟类相同
析构函数的名字也跟类相同
那构造函数跟析构函数不就变成一个了么
不是这样的
虽然它的名字相同
但析构函数要在函数名字前面加上一个波浪号
析构函数它没有参数
也没有返回值
而且也不能重载
因此一个类中只能有一个析构函数
析构函数执行与构造函数相反的操作
通常用于释放分配给对象的存储空间
当程序超出类对象的作用域的时候
或者当对一个类指针使用运算符delete时
系统将自动调用析构函数
和构造函数一样
如果在类的定义中不定义析构函数
编译系统将为之产生一个缺省的析构函数
对于大多数类来说
缺省的析构函数就能满足要求
如果在一个对象完成其操作之前还需要做一些内部处理
则应该定义析构函数
下面我们来看一下我们定义的这个析构函数
大家看这个类的名字叫做My_class
My_class里面这里面有一个char的指针
还有一个整型的MaxLen maximumlen
这里定义了两个参数
一个是char类型指针
一个是int类型的MaxLen
那这里定义的这两个变量都是属于private变量
因为缺省的没写出private
然后在public这个地方定义了My_class
大家这时候一眼就可以看出来这个My_class是构造函数
因为它跟类的名字是一样的
又定义了一个My_class
这里加了一个波浪号
这就是析构函数
在构造函数里面创建了一个char的数组
返回一个指向char的指针
在析构函数里面删除了刚才创建的指针
用delete
那所以这边一个是用new创建
一个是delete
这两个是互逆的操作
上面的例子是析构函数跟构造函数最常见的用法
即在构造函数中用运算符new为字符串分配存储空间
最后在析构函数中用delete释放已分配的存储空间
所以这两个操作是互逆的操作
析构函数也可以在类定义的内部声明
而在类定义的外部定义
例如
上面的析构函数My_class在类定义的外部定义如下
前面是类的名字
后面是函数的名字
这时候大家注意破浪号别忘了
否则的话就变成构造函数
它的功能就是delete str
-讨论实录
--0-0
-6-1 MFC概述
-6-2 C++的基本知识
--6-2-1 类
--6-2-2 对象
--6-2-6 重载
--6-2-9 指针
-6-3 MFC类的组织结构及主要的类的简介
--6-3-2 根类
-6-4 MFC中全局函数和全局变量
-7-1 概述
--7-1-1
--7-1-2
-7-2 按钮控件及其应用
--128B12447816EEF99C33DC5901307461
-7-3 按钮控件及其应用
--7-3
-7-4 静态控件
--7-4
-7-5 列表框控件
--7-5-1
--7-5-2
-7-6 编辑框控件
--7-6
-7-7 组合框控件
--7-7
-7-8 对话框通用控件
--7-8-1
--7-8-2
-讲义源代码
--html
-8-1&2 资源的应用以及菜单资源的使用
--8-1-1
--8-1-2
-8-3 快捷菜单的创建及其应用
--8-3
-8-4 加速键资源的创建及其使用
--8-4
-8-5 工具条资源的创建及其使用
--8-5
-8-6 字符串资源的使用
--8-6
-8-7 位图资源的创建及其使用
--8-7
-课堂示例源代码
--html
-第一次作业内容及要求
--html
--第一次作业及答题链接--作业
-9-1 概述
--9-1
-9-2 Doc/View框架的主要成员
--Video
-9-3 文档操作中的一些重要概念
--Video
-9-4 SDI编程实例
--Video
-9-5 MDI编程实例
--9-5-1
--9-5-2
-课堂示例源代码
--html
-第二次作业内容及要求
--html
--第二次作业及答题链接--作业
-10-1 利用音频函数实现多媒体程序设计
--10-1-1
--10-1-2
--10-1-3
--10-1-4
-10-2 利用Windows Media Player控件实现多媒体程序设计
--10-2
-课堂示例源代码
--html
-例11-1
--例1
-例11-2
--例11-2
-例11-3
--例11-3
-例11-4
--例11-4
-11-1 ODBC介绍与引用
--11-1
-课堂示例源代码
--html
-第三次作业及答题链接