Effective C++笔记 (1.让自己习惯C++)

条款1: 视C++为一个语言联邦

C++是个多重范型编程语言(multiparadigm programming language)。一个同时支持过程形式(procedural)、面向对象形式(object-oriented)、函数形式(functional)、泛型形式(generic)、元编程形式(metaprogramming)的语言。

  • C。C++仍是以C为基础。区块(blocks)、语句(statements)、预处理器(preprocessor)、内置数据类型(built-in data types)、数组(arrays)、指针(pointers)等统统来自C。 C局限没有模板(templates),没有异常(exceptions),没有重载(overloading)。
  • Object-Oriented C++。 面向对象。classes(包括构造函数和析构函数),封装(encapsulation)、继承(inheritance)、多态(polymorphism)、virtual函数(动态绑定)......
  • Template C++。 这是C++的泛型编程(generic programming)部分。
  • STL。 STL是个template程序库。它对容器(containers)、迭代器(iterators)、算法(algorithms)以及函数对象(function objects)的规约有极佳的紧密配合与协调。

请记住:C++高效编程守则视状况而变化,取决于使用C++的哪一部分。

条款2: 尽量以const,enum, inline 替换#define


以常量替换#defines,有两种特殊情况。
 第一:定义常量指针。由于常量定义式通常被放在头文件内(以便被不同的源码含入),因此有必要将指针(而不是指针所指之物)声明为const。
 第二:class专属常量。为了将常量的作用域(scope)限制于class内,你必须让它成为class的一个成员(member);而为确保此常量至多只有一份实体,必须让它成为一个static成员。

一个属于枚举类型(enumerated type)的数值可权充ints被使用。

请记住:
  • 对于单纯常量,最好以const对象或enums替换#defines。
  • 对于形似函数的宏(macros),最好改用inline函数替换#defines。

条款3:尽可能使用const

const 允许你指定一个语义约束(也就是指定一个”不该被改动“的对象),而编译器会强制实施这项约束。它允许你告诉编译器和其他程序员某值应该保持不变。

const多才多艺。可以用它在classes外部修饰global或namespace作用域中的常量,或修饰文件、函数、或区块作用域(block scope)中被声明为static的对象。也可以用它修饰classes内部的static和non-static成员变量。面对指针,可以指出指针本身、指针所指物,或两者都(或都不)是const。

如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。

将const实施与成员函数的目的,是为了确认该成员函数可作用于const对象身上。因为,第一:它们使class接口比较容易被理解。这是因为,得知哪个函数可以改动对象内容而哪个函数不行,很是重要。第二:它们使”操作const对象“成为可能。因为改善C++程序效率的一个根本方法是以pass by reference-to-const 方式传递对象。而此技术可行的前提是,有const成员函数可用来处理取得的const对象。

请记住:
  • 将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。
  • 编译器强制实施bitwise constness,但你编写程序时应该使用”概念上的常量性“(conceptual constness)。
  • 当const 和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。

条款4: 确定对象被使用前已先被初始化

请记住:
  • 为内置型对象进行手工初始化,因为C++不保证初始化它们。
  • 构造函数最好使用成员初始值(member initialization list),而不要在构造函数本体内使用赋值操作(assignment)。初值列列出的成员变量,其排列次序应该和他们在class中的声明次序相同。
  • 为避免”跨编译单元之初始化次序“问题,请以local static对象替换non-local static对象。





你可能感兴趣的:(C++)