EffectiveC++摘要.docx

  1. 1、本文档共28页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1,C++属于一个语言联邦 : C???? Object-Oriented C++???? Template C++?????? STL 2,应尽量以const,enum,inline替换#define   如果一个常量是class专属常量又是static,且为整数类型(int,char,bool),则需特殊处理:只要不取它们的地址,可以声明并使用它们而不须提供定义式。 但是如果取某个class专属常量的地址,或纵使不取其地址而编译器却(不正确的)坚持要看到一个定义式,必须提供定义式 enum的行为某方面比较像#define而不像const:取一个const地址合法,但是取一个enum地址就不合法,而取#define也不合法,如果不想让被人获得一个pointer或reference指向你的某个整数常量,enum可以帮助你实现这个约束 #define和enum不会设定额外的空间,const在优秀的编译器中也许可能也是这样,但是不够优秀的编译器就必须设定额外的空间 3,尽可能使用const const语法虽然变化多端,但并不莫测高深。如果关键字const出现在*左侧,表示被指物是常量;如果出现在*右边,表示指针自身是常量;如果出现在*两边,表示被指物和指针都是常量 std::vectorint? vec; const std::vectorint::interator? iter = vec.begin()??????????????????? T*const std::vectorint:const_iterator iter = vec.begin()?????????????????????? const T* ? 将const实施于成员函数的目的,是为了确认该成员函数可作用于const对象身上 const特性的两个函数可以重载(必须在类中,不在类中会出现问题) const函数不可改变对象任何变量(注意区分指针的情况,只要指针不变,指向的值可变化) 注意操作符[]的重载要返回值的引用,否则不能对结果赋值(相当于对值的一个拷贝赋值,没有意义) mutable可以在常函数中修改其值,但是一般作用是:1,用于缓存2,或必须在常函数中修改值 ? 利用const operator[]实现出non-const版本: class TextBlock { public: ?????????? const char operator[](std::size_t position) const {? .....?????????????? return text[position]; } ?????????? char operator[](std::size_t position){ ????????????????? return? const_castchar (? static_castconst? TextBlock (*this)[position]); }; ? 非const调用const是安全的 const调用非const是不安全的,(因为非const有可能改变) 总结: ????? 1将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体 ????? 2编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”(conceptual constness) ????? 3当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复 4,确定对象被使用之前已被初始化: 为了保证一定性,使用内建数据类型一定要初始化,构造对象要保证构造函数初始化它的成员 C++ 对“定义在不同的编译单元内的non-local? static对象”的初始化相对次序并无明确定义。因为决定它们初始化次序相当困难,根本无解 最常用的形式,就是? 多个编译单元内的non-local static对象经由“模板隐式具体化,implicit template instantiations形式(而后者自己可能也是经由”模板隐式具现化“形成) ? 任何一种non-const static对象,不论它是local或non-local,在多线程环境下“等待某事发生”都会有麻烦。处理方法:在程序的单线程启动阶段手工调用所有的reference-returning函数,这可消除与初始化有关的“竞速形势” ? 为了避免在对象初始化之前过早地使用它们,你需要做三件事: 第一,手工初始化内置型non-member对象。 第二,使用成员初值列对付对象的所有成分 第三,在”初始化次序不缺定性“(这对不同编译单元所定义的

文档评论(0)

麻将 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档