3.构造函数与析构函数.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
3.构造函数与析构函数.ppt

3.构造函数与析构函数 第3章 构造函数与析构函数 建立一个对象时,对象的状态(数据成员的值)是不确定的。 为了使对象状态确定,必须对数据成员赋初值。构造函数用于对象的初始化。 当对象消失时,使用析构函数来释放由构造函数分配的内存或其它资源。 构造函数、复制初始化构造函数和析构函数是用以构造类的基本成员函数。要理解并掌握其设计方法。 第3章 构造函数与析构函数 主要内容 构造函数的作用、定义和使用 析构函数的作用、定义和使用 构造函数类型转换 对象的初始化 对象赋值 对象成员 3.1 构造函数 例3-1:在C++中,可以使用初始化列表来对类的对象进行初始化。(P39示例) 3.1 构造函数 3.1.1 定义构造函数 构造函数与类名同名,没有返回值类型。它的访问属性必须是public 例3-2:调试运行P40的示例3.2和示例3.3。建议将这2个程序写在一个文件中。 3.1 构造函数 3.1.1 定义构造函数 全局变量的执行会先于main函数(P41例3.4)。 在上例的main函数的外部定义一个全局Test变量,看看运行结果是什么? 3.1 构造函数 3.1.2 构造函数和运算符new 运算符new用于构造动态对象,new返回这个对象的指针。 例3-3:继续前页例3-2的示例程序,将main程序替换为P41下面的程序。 用new分配的内存使用delete运算符来回收。 3.1 构造函数 3.1.3 缺省构造函数 当类中没有任何构造函数时,C++编译器会自动提供一个形如下面的空的构造函数: 所以,我们将没有参数的构造函数称为默认构造函数。 继续前页例3-2的示例程序,将类定义中的默认构造函数与类体中的默认构造函数实现注释掉,看看会出现什么结果? 当类中有定义的构造函数时,C++编译器不会再为你提供空的默认构造函数。 P42提及:定义对象数组时,必须要调用默认构造函数。 3.1 构造函数 3.1.4 复制初始化构造函数 形如下面的构造函数称为复制初始化构造函数,用于使用另一个类对象来初始化本对象: 3.2 析构函数 析构函数用于在对象消失时执行一些清理任务,如释放由构造函数的申请的内存等。 3.2 析构函数 析构函数什么时候执行? 函数体内定义的局部变量,它的生命周期结束时,C++系统会调用它的析构函数。 例3-6:在上页的示例中,输入下面代码调试,运行结果是什么? 3.2 析构函数 析构函数什么时候执行? 函数体内定义的局部对象变量,它的生命周期结束时,C++系统会调用它的析构函数。 全局对象变量,在程序结束时,调用析构函数。 练习:上面的示例中,在main函数外,定义一个全局对象变量,看看运行结果是什么? 3.2 析构函数 析构函数什么时候执行? 函数体内定义的局部对象变量,它的生命周期结束时,C++系统会调用它的析构函数。 全局对象变量,在程序结束时,调用析构函数。 对象数组和局部变量一样,在生命周期结束时,调用析构函数。 练习:上面的示例中,将main函数替换为P45例3.6的main函数,看看运行结果是什么? 3.2 析构函数 析构函数什么时候执行? 函数体内定义的局部对象变量,它的生命周期结束时,C++系统会调用它的析构函数。 全局对象变量,在程序结束时,调用析构函数。 对象数组和局部变量一样,在生命周期结束时,调用析构函数。 使用delete运算符删除一个动态对象时,会先调用该对象的析构函数,再释放内存。(P46. 3.2.3) 练习:上面的示例中,将main函数替换为P41下面的main函数,看看运行结果是什么? 3.2 析构函数 3.2.3 缺省析构函数 每个对象都有一个析构函数。 如果在定义类时,没有定义析构函数,C++会自动产生一个: 3.3 构造函数类型转换 类对象可以作为操作数用在表达式中,如: 上述的obj=10;是否能够进行,要看在Test类中是否有合适的构造函数: 3.3 构造函数类型转换 例3-7:仍然使用上节例3-6的示例程序,添加1个print函数,将main程序替换为P48的main程序,观察运行结果并分析。 把下面这个构造函数的定义与实现注释掉,看是否出现错误? 3.4 对象的初始化 下述代码: C++编译器解释为:(可以通过构造函数与析构函数的执行情况了解到) 对于任何类,如果没有复制初始化构造函数,编译器会构造一个: 3.4 对象的初始化 但这种缺省初始化构造函数有时会出问题。P49的string类示例了这种情况。 例3-8:将P49的string类的示例程序上机调试,观察运行结果并分析。(程序见下页) 该程序编译通过,运行时,当最后退出运行时,执行析构s2时出错,因为s2.str与s1.str是同一段内存,已经被s1析构过了。

文档评论(0)

zhoujiahao + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档