构造函数和析构函数

上传人:kms****20 文档编号:51393880 上传时间:2018-08-13 格式:PPT 页数:34 大小:222.50KB
返回 下载 相关 举报
构造函数和析构函数_第1页
第1页 / 共34页
构造函数和析构函数_第2页
第2页 / 共34页
构造函数和析构函数_第3页
第3页 / 共34页
构造函数和析构函数_第4页
第4页 / 共34页
构造函数和析构函数_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《构造函数和析构函数》由会员分享,可在线阅读,更多相关《构造函数和析构函数(34页珍藏版)》请在金锄头文库上搜索。

1、构造函数和析构函数 第10章构造函数 析构函数 实现类型转换和拷贝的构造函数 构造函数和对象成员本章学习要求初始化对象的必要性和使用初始化列表初始化对 象。 隐藏对象的产生过程和构造函数类型转换;复制 初始化构造数的使用;复制初始化构造函数和析 构函数的执行方式,对象赋值方法; 析构函数定义、作用及何时被调用;使用运算符 delete除动态对象的方法;缺省析构函数;对象 成员和对象成员构造函数的定义方法;对象成员 构造函数和析构函数的调用顺序; 定义构造函数的方法并能用运算符new建立动态对 象;缺省构造函数;运用对象数组;复制初始化 构造函数的定义方法。构造函数对象是类的实例,在使用对象中的

2、成员数据之前 ,首先要对对象中的成员数据进行初始化。 在定义类时不能对类中的成员数据直接初始化, 但在创建对象时可借助于四种方法进行初始化。 构造函数的定义 构造函数和对象的初始化 构造函数的重载 缺省构造函数和具有缺省参数值的构造函数 10.1四种方法进行初始化用初始化列表的方法,这种方法的缺点是只能对 公有成员数据初始化,对私有和保护类型的数据 无能为力,又由于对象的封装性要求将类的成员 数据都定义为私有的,因此这种方法不常用; 通过赋值语句来实现,即将一个已经初始化的对 象赋给要初始化的对象; 通过在类中定义一个成员函数,该成员函数能够 对对象中的成员数据进行设置; 通过构造函数来进行初

3、始化,这是一种最常用的 方法,它的特点是在创建对象的同时能自动对对 象中的成员数据进行初始化。 构造函数的定义C+规定与类同名的成员函数是构造函数, 它是一个特殊的成员函数,没有返回值。 构造函数定义的一般格式为: :() 示例 构造函数没有返回值,在声明和定义构造 函数不能说明它的类型,即使void类型也 不行。 10.1.1class CSimpleString char *string;int length;public:CSimpleString(int); /声明构造函数 ; CSimpleString:CSimpleString(int a) /定义构造函数 string=0;le

4、ngth=a; 构造函数和对象的初始化C+系统规定在创建一个对象时,首先调用该对象 的构造函数,因此通常利用构造函数对对象中的 成员数据进行初始化。对构造函数的调用是隐性 的,即由编译系统自动调用,在创建对象时可以 向构造函数传递实参,一般格式为: (); 其中为向构造函数传递的参数,它可以 为空,该实参表必须与某个构造函数的参数的类 型和个数一致。 【例10.5】 构造函数的初始化作用 10.1.2【例10.5】 构造函数的初始化作用构造函数的重载与普通函数一样,只要参数的个数或类型不同, 就可以实现构造函数的重载。也就是说,一个类 可以有多个构造函数。 具有多个构造函数使得类具有更大的灵活

5、性,即 可以根据不同的要求进行不同的初始化。与普通 函数类似,根据创建对象时对象后的的 类型和个数,系统将会自动调用与该匹配的构造函数,如果不存在相匹配的构造 函数,则系统报错。 【例10.6】构造函数的重载 10.1.3【例10.6】构造函数的重载缺省的构造函数缺省的构造函数 具有缺省参数值的构造函数 10.1.4缺省的构造函数在创建一个对象时,系统会自动调用构造函数。 如果在类中没有定义构造函数,编译系统会自动 产生一个缺省的构造函数,其格式为: :( ) 这是一个参数表和函数体都为空的构造函数,它 并没有对对象中的成员数据做任何的初始化工作 。因此如果在创建对象过程中调用缺省构造函数 ,

6、则对象中的数据是不确定的,还必须采用其它 方式对对象中的成员数据进行初始化。 【例10.7】调用缺省构造函数 对于缺省的构造函数要注意的几点 【例10.7】调用缺省构造函数对于缺省的构造函数要注意的几点如果在类中定义了构造函数,则编译器就 不会自动产生缺省的构造函数 要在创建对象的同时对其中的成员数据初 始化,就必须定义构造函数 创建对象时,一定要调用一个构造函数, 不管是自定义的构造函数,还是缺省的构 造函数。如果没有相应的构造函数,则会 产生错误。比如 具有缺省参数值的构造函数在创建对象时,必须给带参数的构造函数传递相 应的参数,否则将不能调用该构造函数。与调用 具有缺省参数值的普通函数一

7、样,对于具有缺省 参数值的构造函数,在创建对象时也不需要向它 传递全部参数值。 具有缺省值的构造函数的定义方式与定义具有缺 省参数值的普通函数的方式完全一样,它们也具 有相同的约束条件 【例10.8】具有缺省参数值的构造函数 具有缺省参数值的构造函数有两种形式:参数表 为空的构造函数、参数有缺省值的构造函数 如果构造函数只有部分参数有缺省值,则具有缺 省值的参数必须在参数表的右侧 在同一个类中,可以有多个具有缺省参数值的构 造函数,不过这时要看构造函数的调用情况,有 时可能会产生二义性的错误。因此通常情况下, 一个类中只有一个具有缺省参数值的构造函数 在创建对象时,如果有超过一个构造函数的形参

8、 与对象的实参匹配,则会产生二义性的错误 【例10.8】具有缺省参数值的构造函数析构函数创建对象时自动调用构造函数,对对象中成员数 据进行初始化的工作。撤消对象时,则要自动调 用析构函数,承担撤消对象后的善后处理工作。 析构函数是一种特殊的成员函数,定义格式为: :() 析构函数的特殊性 撤消对象的方式有两种 当没有定义析构函数时,系统会自动产生析构函 数,该函数为空函数,并不做任何工作。 【例10.14】调用用户自定义的析构函数 【例10.15】 10.2析构函数的特殊性函数名为类名前加字符“ ” 没有参数,也没有返回类型。因此它不能 重载,即一个类至多只能有一个析构函数 当撤消对象时自动调

9、用析构函数 撤消对象的方式有两种一种方式为自动撤消,对于局部自动类型 的对象,当超出其作用域时,对象将自动 撤消;对于全局和静态类型的对象,当程 序终止时自动撤消对象;对临时对象,在 该对象参与运算之后立即撤消。 另一种方式是主动撤消,即当用new运算符 为对象指针动态分配存储空间,而用 delete释放该存储空间时将撤消该对象。 【例10.14】调用用户自定义的析构函数【例10.15】delete运算符撤消对象时调用析构函数 实现类型转换和拷贝的构造函数10.3构造函数除了可以在创建对象时对其中的 成员数据进行初始化之外,一些特殊类型 的构造函数还具有其它特殊作用。这一部 分主要介绍利用构造

10、函数进行类型转换以 及具有拷贝功能的构造函数。 利用构造函数进行类型转换 拷贝构造函数 利用构造函数进行类型转换对于基本数据类型,不同类型的数据之间可以互 相转换,它们之间可以自动转换,也可进行强制 类型转换。当然,前提是它们之间必须兼容。 对于用户自定义类型数据,不同类型的数据之间 也可以进行转换,而且也有两种转换形式:自动 转换和强制转换。这些转换都是通过构造函数实 现的。 【例10.9】 只有一个参数的构造函数实现类型的 自动转换 【例10.10】 用构造函数进行强制类型转换 用构造函数进行类型强制转换的一般格式为: () 【例10.9】 构造函数实现类型的自动转换【例10.10】 用构

11、造函数进行强制类型转换拷贝构造函数将完成拷贝功能的构造函数称为拷贝构造函数。 拷贝构造函数是一种特殊的构造函数。格式如下 : :(const&) 拷贝构造函数的参数为它所在类类型的引用。当 用一个已有的对象对正在创建的对象进行初始化 时,调用该构造函数函数。它的特殊功能是能将 参数代表的对象逐域拷贝到新创建的对象中。 C+中的拷贝构造函数有两种形式 系统自动产生用户自定义系统自动产生拷贝构造函数当用户没有定义拷贝构造函数时,系统将 会自动产生一个拷贝构造函数。 【例10.11】调用自动拷贝函数 【例10.11】调用自动拷贝函数用户自定义拷贝构造函数可以在类中定义一个拷贝构造函数,此时 系统将不再自动产生拷贝构造函数。比如 上例可以改为 【例10.12】利用自定义的拷贝构造函数 【例10.12】利用自定义的拷贝构造函数构造函数和对象成员在定义一个新类时,可以把一个已定义类 的对象作为该类的成员,称为对象成员。 对于含有对象成员的对象,在对该对象进 行初始化之前,首先要对该对象中对象成 员进行初始化,这要通过调用对象成员的 构造函数来实现。当类中含有对象成员时 ,通常采用“初始化成员列表”的方法向对象 成员的构造函数传递实参。 【例10.17】 分析程序的输出结果 10.4【例10.17】 分析程序的输出结果

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号