google_style_guide 1.头文件 通常每一个.cc文件都有一个对应的.h文件.也有一些常见例外,如单元测试代码和只包含main()函数的.cc文件 1.1Self-contained头文件 所有头文件要能够自给自足。换言之,用户和重构工具不需要为特别场合而包含额外的头文件。 详言之,一个头文件要有1.2.#define保护,统统包含它所需要的其它头文件,也不要求定义任何特别symbols. 不过有一个例外,即 2024-11-27 c++ > google_style #c++
9. 杂项讨论 53. 不要轻忽编译器的警告 123456789class B{public: virtual void f() const;}class D{ public: virtual void f();} 希望D::f重新定义virtual函数B::f,B的f 是个const成员函数,而D中未被声明为const 严肃对待编译器发出的警 2024-11-27 c++ > effective c++ #c++
8. 定制new和delete 49. 了解new-handler的行为 当operator new无法满足某一内存分配需求时,它会抛出异常。以前它会返回一个u1指针,某些旧式编译器目前也还那么做。 当operator new抛出异常以反映一个未获满足的内存需求之前,它会先调用一个客户指定的错误处理函数,一个所谓的new_handler。 为了指定这个“用以处理内存不足”的函数,客户必须调用set new han 2024-11-27 c++ > effective c++ #c++
7. 模板与泛型编程 41. 了解隐式接口和编译期多态 面向对象编程世界总以显示接口和运行期多态解决问题 由于w的类型被声明为Widget,所以w必须支持Widget接口。我们可以在源码中找出这个接口(例如在idget的.h文件中),看看它是什么样子,所以我称此为一个显式接口(explicit interface),也就是它在源码中明确可见。 由于Widget的某些成员函数是virtual,w对那些函数的调 2024-11-27 c++ > effective c++ #c++
6. 继承和面向对象设计 32. 确定你的public继承塑模出is-a关系 “public继承”意味is-a is-a并非是唯-存在于classes之间的关系。另两个常见的关系是has-a(有一个)和is-implemented-in-terms-of(根据某物实现出)。 “public继承”意味is-a。适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每 2024-11-27 c++ > effective c++ #c++
5. 实现 26. 尽可能延后变量定义式的出现时间 当定义了一个变量而其类型带有一个构造函数或析构函数,那么当程序的控制流(control flow)到达这个变量定义式时,你便得承受构造成本;当这个变量离开其作用域时,你便得承受析构成本。即使这个变量最终并未被使用,仍需耗费这些成本,所以你应该尽可能避免这种情形。 这让我们联想起本条款所谓“尽可能延后”的真正意义。你不只应该延后变量的定义,直到非得 2024-11-27 c++ > effective c++ #c++
4. 设计与声明 18. 让接口容易被正确使用,不易被误用 1234class Date{public: Date(int month, int day, int year);}; 函数接口 可能以错误的次序传递参数,或者传递一个无效的月份或天数 导入简单的外覆类型来区别天数,月份等 1234567891011121314151617struct Day{exp 2024-11-27 c++ > effective c++ #c++
3. 资源管理 13. 以对象管理资源 123456void f(){ Investment *pInv = createInvestment(); ··· delete pInv;} 可能无法执行delete 在···中过早return 若delete位于某循环中,由于continue或者goto语句过早退出 ···内抛出异常 泄露的不只是内含投资对象的那块内存,还包括那 2024-11-27 c++ > effective c++ #c++
2. 构造、析构、赋值运算 5. 了解c++默默编写并调用那些函数 在C++处理之后,empty class(空类)不再是个空类,如果没有声明,编译器就会为它声明一个copy构造函数,一个copy assignment 操作符和一个析构函数,所有这些函数都是public且inline的。 如果声明了一个构造函数,编译器不再为它创建default构造函数 在一个“内含reference成员”的class内支持赋 2024-11-27 c++ > effective c++ #c++
1. 让自己习惯C++ 1. 视C++为一个语言联邦 C语言 Object-Oriented C++ Template C++。这是C++的泛型编程 STL。STL是个template程序库, 2. 尽量以const,enum,inline替换#define 1#define ASPECT_RATIO 1.653 记号名称ASPECT_RATIO也许从未被编译器看见:也许在编译器开始处理源码之 2024-11-27 c++ > effective c++ #c++