C++-OOP2-cctor-dctor-5.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文档。上传文档
查看更多
C-OOP2-cctor-dctor-5

面向对象程序设计 C++ #引子 - String 类 逐步完成一个String 类替代char * [例5.1] 设计:数据成员 + 函数成员 – 接口 原则:成员尽可能的少;只考虑必要的成员。 接口:strlen(), strcpy() 的替代函数 # String 类的实现 String类的copy函数 String类对象的使用 增加destroy() 接口 问题总结 const化是个好习惯 参数和返回值 长度可变,自适应 —— 使用new + 指针 记住delete 指针 记住初始化 s 不用时,怎么办? 记住销毁它 构造函数和析构函数 (4.2) 我们希望:在建立对象时,对象能自动地完成初始化 —— 构造函数 最好是,对象声明时,其初始化工作自动完成 String s; // s 的构造函数自动调用,完成初始化 我们还希望,当对象没用时,对象自动完成销毁 —— 析构函数 { String s; ....; } // 出了其代码块s被自动调用析构函数销毁 构造函数 (4.2.2) 构造函数 (4.2.2) 构造函数 (4.2.2) 设计下面的类及其构造函数 Point 点 Date 日期 Class 班级 Student 学生 构造函数中的初始化列表句法 为何引入初始化列表句法? 从概念上讲,构造函数分两个阶段执行:初始化阶段和普通计算阶段。初始化列表属于前者,而构造函数的函数体中语句属于后者。 有些成员必须在构造函数初始化列表中进行初始化,而无法赋值。如const或引用类型的成员,或无默认构造函数的类类型的成员。【例?】 如果 赋值语句/初始化列表句法 都可以,推荐使用 初始化列表句法。 初始化列表可以接受表达式;对于m(exp) 如果m是基本类型,则用exp表达式值来初始化m; 如果m是类类型,则相当于调用构造函数来初始化m,其选择的构造函数视exp的类型而定; 如果m是类类型,而m没有在初始化列表中被初始化,则会自动调用m类的默认构造函数初始化。 初始化列表中的出现次序不是成员被初始化的执行次序。 析构函数 (4.2.3) String 类 - 构造函数 + 析构函数 为String 类添加构造函数 析构函数【例5.2】 默认构造函数 (4.2.2 p60) 构造/析构函数的调用顺序(4.2.8) 析构函数的调用顺序与构造函数相反。 对象 x1, x2, x3 的销毁次序是x3, x2, x1。 全局对象和静态对象: 其构造函数在任何函数(包括main)执行之前调用 但不同文件间全局对象构造函数的执行顺序是不确定的。 当main终止或调用exit函数时调用相应的析构函数。 局部对象: 在对象定义时调用构造函数。 在对象离开程序块时调用其析构函数。 构造/析构函数的调用顺序(4.2.8) 函数内static对象 构造函数在程序首次执行到对象定义时调用一次 析构函数在main终止或调用exit函数时调用。 构造函数调用顺序: 全局对象 局部自动(或静态)对象(按执行顺序)。 析构函数调用顺序: (逆序)局部自动对象 main( )执行结束后,静态对象(局部或全局) — 全局对象。 #const 成员函数 错误原因:c_str() 没有承诺“不修改”cs。 怎么办? const char *c_str(const String cs) { ...; } // ? 对象是被隐式调用的,所以无法将之声明为const。 #作用域(scope) (参考3.1.8) 作用域描述了名字在文件的多大范围内可见。 局部变量在代码块内可见 for (int i = 0; i n; i ++) { ...; } 函数内的变量只能在函数中使用。 全局变量在整个文件内有效。 静态变量的作用域? 视具体定义位置而定。 定义在名字空间(namespace)内的名字只在其名字空间内有效。 类成员在类作用域内有效 —— 封装。 C++函数的作用域在类/名字空间内。 #名字空间 namespace 名字:变量, 函数, 结构, 枚举, 类及其成员等。 项目很大时,名字冲突的可能性比较大。 C++引入 namespace 隔离之。作用域操作符:: namespace ns1 { int x; float y; } namespace ns2 { int x; double z; } ns1::x = 10; ns2::x = 20; ns2::z = 1.41; using 关键字 using namespace std; // 使得std名字空间可用 using std::cout; // 使得std::cout名字可用 #名字空间 namespace 名字空间可以嵌套。 std 名字空间中有cin、cout、cerr、string及S

文档评论(0)

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

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

1亿VIP精品文档

相关文档