- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第3章 类与对象(续) 3.1 构造函数(constructor) 3.1.1 对象的初始化 对象初始化的问题 类声明时不能赋初值 why 定义对象时赋初值, 私有/受保护成员变量怎么办? 程序员定义对象时忘了赋初值怎么办? 程序员会不会多次调用赋初值函数,导致多次初始化? 3.1.2构造函数 C++语言的构造函数是一种特殊的成员函数,其特征是: 构造函数的名字必须与类名字相同。 构造函数不能指定返回类型,即使是void类型也不允许。 一个类可以由多个构造函数,即:可以通过重载使一个类具有多种初始化方法。 当程序中声明一个新对象时,程序会自动(隐式)调用默认的构造函数来初始化这个对象的状态。 如果我们设计的类没有定义构造函数, C++编译程序会自动为该类建立一个缺省的构造函数。这个缺省构造函数没有任何形式参数,并且函数体为空。 3.1.3 构造函数的调用时机 全局对象的构造函数在main( )函数执行之前就被调用。 全局静态对象的构造函数在main( )函数执行之前被调用。 局部静态对象的构造函数是当程序第一次执行到相应的声明语句时才被调用。 给出一个外部对象的引用性声明时,并不调用相应的构造函数,因为这个外部对象只是引用在其他地方声明的对象,并没有真正地创建一个对象。 动态创建对象时(后面讲)。 定义对象数组时(后面讲) 。 3.1.4 构造函数的重载 当一个类有多个构造函数时,必须构成重载关系,主要有: 无参数构造函数 带参数构造函数 缺省参数构造函数 3.1.5 初始化列表 类的引用成员如何初始化? 基类的带参数构造函数,如何调用?(后面讲) 没有无参数构造函数的对象型数据成员如何初始化? 3.1.5 初始化列表 初始化列表的参数表一般来自“参数表0”,也可以使用任意复杂的表达式或函数调用。参数为空则可以省略。 初始化列表也用来对一般的数据成员进行初始化:无参数的对象成员,简单类型的数据成员。 有参数的对象成员的初始化,初始化引用成员,初始化常量对象,显式调用基类的构造函数则必须用初始化列表来完成. 3.1.5 初始化列表 对象成员构造函数的调用次序取决于这些成员在类中声明的次序,与它们在初始化列表中出现的次序无关。 创建类C的一个新对象时,程序将先完成初始化列表的初始化工作后(包括初始化列表中的对象成员的构造函数)后,再对初始化列表中没有列出的数据成员进行初始化,最后执行类C的构造函数体内的语句。 对象成员析构函数的调用次序与构造函数刚好相反。 3.1.6 什么时候必须定义无参数构造函数 前提:类定义了带参数的构造函数(注意缺省值情况),则在以下情况必须定义务参数构造函数: 定义对象数组时。 作为基类且派生类没有显式调用这个基类的构造函数。 定义对象且没有显式初始化时。 3.2析构函数 C++语言的析构函数是一种特殊的成员函数,用于在对象撤销时执行一些清理任务,并释放出构造函数分配的内存等,其特征是: 析构函数名字必须是在类名前面加上一个波浪号“~”。 析构函数不能指定返回类型,即使是void类型也不允许。 一个类只能有一个析构函数。 析构函数不可指定任何形式参数。因为创建对象是由程序员指定的,而撤销对象是在对象生命期结束时由程序自动完成的,因此程序员无法提供析构函数的实际参数。 3.2.1析构函数的作用 用户希望在对象撤销前执行的操作,如: 对相同类的对象个数进行记帐 释放对象占用的资源,主要是堆内存(用new申请的),文件句柄等 其他任何希望做的事情 3.2.2 析构函数的调用时机 程序员手工释放动态生成的对象 对象的生存期结束前 3.3 调用构造函数和析构函数的顺序 完全相反 3.4 对象数组 CStudent students[10]; CStudent students[3] ={60,70,80}; ***P82*** CStudent students[2]={ CStudent(1,2,3), CStudent(4,5,6), CStudent(7,8,9), }; 3.5 对象指针 对象指针就是指针的基类型为类的指针,如: 类名 * pObject = NULL; 对象的指针指向对象空间的起始地址 对象的起始地址可以作为对象指针使用 3.5.1 指向对象的指针 类名 * 指针名 = NULL; 如: CStudent * pStudent = NULL; CStudent tom; pStudent = tom; coutpStudent-getage(); cout(*pStudent).getage(); 3.5.1 指向对象的指针——特例this 只能在非静态成员函数中使用(非静态) ,tom.this是没有意义的。 this如何传递的,作为函数的”第一个参数”
文档评论(0)