- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
面向对象程序设计 构造函数和析构函数 主要内容 1. 构造函数和析构函数 2.几个特殊的构造函数 默认构造函数 单参数构造函数[转换构造函数] 复制构造函数 赋值运算符[=] 0、引子 0数据的初始化[initialization] int x = 1; double d = 3.14; 在基于过程编程中,程序员遇到的错误很多是由于引用了未被初始化的变量. 普通变量在使用前未被初始化会造成逻辑错误。 指针变量在使用前未被初始化会引发运行时错误. 0普遍变量未初始化 0指针变量未初始化 C++允许的初始化 基本数据类型变量可采用函数表示法进行初始化操作,格式为: 例:static int i(6); 作用域运算符”::”补充说明 若全局变量与局部变量同名,则在局部变量的作用域内会将同名的全局变量隐藏起来。在C语言中在该作用域内无法再访问到同名的全局变量,即它不可见,但它仍然存在。C++增添了作用域运算符”::”,用以访问被隐藏的全局变量,解决了全局变量和局部变量同名时所发生的冲突。 作用域运算符”::”补充说明 #include iostream using namespace std; int x; void main(void) { auto int x = 1; cout“(1)x=”xendl; ::x=6; //给全局变量x赋值 cout“(2)x=”::xendl; } 0一些健壮(robust)的机制 引用作为一种新提出的健壮的数据访问机制,在建立的时候规定必须初始化,并由系统自动释放. int x; int r = x; 类作为更高级的数据类型,也规定了在使用对象之前必须初始化,或者采用某种机制自动初始化. 0对象初始化的特殊性 类的特殊性决定了类对象初始化时不能如普通数据一样初始化. int x=1, *pX=x, rX=x; struct student s = {“Tom”,85}; class Date date = {2002, 10, 30} 不能由对象访问私有数据成员. 让成员函数访问私有数据成员 —调用访问函数和工具函数手动设置 1、构造函数和析构函数 1.1构造函数(constructor) C++规定与类同名的成员函数是构造函数; 主要用途: 给对象赋予有意义的初始值. 给数据成员分配内存,然后初始化,不执行对象的主要任务 1.1构造函数举例1 1.1构造函数举例2 1.1构造函数的特点: C++中的”类”只定义了一组对象的类型,要使用这个类还必须用”类”说明它的对象,每个对象中的数据成员还必须赋初值,这些功能都是由构造函数完成的。 1).构造函数是类中一种特殊的成员函数,其定义格式和其他成员函数相同,它的名字与类名相同,没有返回类型,连void都不能写。在OOP中,管理一个类对象的机制是每当该类的对象创建时,编译系统为它的对象分配内存空间,并自动调用构造函数初始化所创建的对象,从而确保每个对象自动地初始化。 2).构造函数只完成新对象的初始化工作,不执行对象的主要任务。即在类创建新对象时,为对象的数据成员分配内存空间,给该对象的数据成员赋初值。 1.1构造函数的特点: 3).构造函数可以重载,用不同的方式创建对象.即每个类可以定义多个构造函数,以适应创建对象时,对象的参数具有不同个数和类型的情况。 4).一般由系统自动、隐式的调用。 5).访问权限一般为public。 6).创建对象引用和对象指针时,不会调用构造函数。 1.1构造函数的特点: 对象引用:为某类的对象定义一个引用。其定义格式为: 对象指针:指向某类对象的指针。定义格式为: 1.1构造函数举例3—练习 1、分析下列代码,为类A提供必要的构造函数 1.1构造函数的重载和匹配 1.2析构函数(destructor) 有些类在构造对象时,要给对象分配内存,这些内存在对象撤销之前要被释放. 当结束对象的生命期时,系统都会自动调用该类的析构函数. 析构函数本身并不删除对象,而是进行系统释放对象内存之前的清理工作. 1.2析构函数的特点 1).名字是在类名之前加上‘~’,表示逆构造,是构造函数的反函数. 2).析构函数没有参数和返回类型,只能有一个,而且不能重载. 3).析构函数以构造函数相反的顺序被调用. 4).用new运算符创建对象时,会自动调用相应的构造函数,但是只有用delete运算符释放时,编译系统才调用析构函数.换句话说,对于用new运算符创建的动态对象,如果没有用delete运算符释放资源时,编译系统不会调用析构函数。 1.2析构函数的特点 (5)如果编程者没有给某个类定义析构函数,那么编译系统将生成一个什么也不做
文档评论(0)