Effective C++读书笔记(持续更新)

一、让自己习惯C++

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

  • C++高效编程守则视状况而变化,取决于你使用C++的哪一部分

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

  • 对于单纯常量,最好以const对象或enum替换#define

  • 对于形似函数的宏,最好改用inline函数替换#define

条款03:尽可能使用const

  • const出现在星号左边,表示被指物是常量;const出现在星号右侧,表示指针是常量

std::vector vec;
...;
const std::vector::iterator iter   // iter的作用像个T* const 
    = vec.begin();
std::vector::const_iterator cIter // iter的作用像个const T*
    = vec.begin();              
  • 两个成员函数如果只是常量行不同,可以重载;意味着const成员函数和非const成员函数可以重名

  • 将某些东西声明为const可以帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。

  • 编译器强制实施bitwise constness,但你编写程序时应该使用”概念上的常量性“

  • 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。

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

  • 为内置型对象进行手工初始化,因为C++不保证初始化他们

  • 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列列出的成员变量,其排列次序应该和他们在class中的声明次序相同。

  • 为免除”跨编译单元之初始化次序“问题,请以local static对象替换non-local static对象。

二、构造、析构、赋值运算

条款5:了解C++默默编写并调用那些函数

  • 编译器可以自己为class创建defualt构造函数、copy构造函数、copy assignment操作符、以及析构函数

  • 如果在含有引用&或者const修饰的成员变量的类需要支持赋值操作(copy assignment),则需要自己定义赋值操作,不可以依赖编译器提供的。

  • 在基类的copy assigment操作符声明为private,编译器拒绝为该继承类提供copy assignment。

条款6:若不想编译器自动生成的函数,应该明确拒绝

  • 使用如下手段,可以编译器不会为类提供拷贝函数和=重载等号运算符

class Uncopyable {
protected:
    Uncopyable() {};
    ~Uncopyable() {};
private:
    Uncopyable(const Uncopyable&);
    Uncopyable& operator = (const Uncopyable&);
};
​
// 为阻止HomeForSale对象被拷贝,需要继承Uncopybale
class HomeForSale :private Uncopyable {
​
};

条款7:为多态基类声明virtual析构函数

  • 带有多态性质的base class应该声明一个virtual 析构函数。如果class带有任何的virtual函数,它就应该拥有一个virtual析构函数

  • class的设计目的如果不是作为base class使用,或不是为了具备多态性,就不应该声明virtual析构函数

条款08:别让异常逃离析构函数

  • 析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下&#

你可能感兴趣的:(c++,visual,studio)