《Effective C++》 笔记

导读

1. C++对 signature 的定义并不包含函数的返回类型。
2. 将构造函数声明为explicit避免隐式转换
3. 当新对象被定义时,一定会有构造函数被调用,因此Widget w3 = w2; 会调用Widget的copy构造函数,而不是assignment操作符。
4. 可以使用operator * (a, b); 来实现想乘的操作,其他操作符也类似。

Item 1:View C++ as a federation of languages.

1. 内置类型的值传递(pass by value)比引用(pass by reference)更高效
2. C++可以认为是由 C , OO, Template和 STL组成

Item 2: Prefer consts,enums,and inlines to #defines.

1. 定义一个常量字符串,const char* const str = "a string";
2. class专属常量:如static const int num = 5; 这是一个声明,需要在类外提供定义const int ClassName::num = 5; (除非这个类型是整数类型,如int char bool, 也有可能编译不支持省略定义)。
3. 用template inline 函数代替 函数宏。

Item 3: Use const whenever possible

1. const char* const p; 第一个const (*号左边的,可以放在类型后边)修饰data, 第二个修饰pointer.
2. STL中,const std::vecotr<int>::iterator iter;代表迭代器不可变,而std::vector<int>::const_iterator cIter代表所指的东西不可变。
3. 对函数的返回值(引用类型)加const使返回的引用不被修改, 这样的函数可以重载没有const的函数。当一个const对象调用这个函数时,会调用带const的那个重载函数。
4. const成员函数不可以改变对象内任何no-static成员变量,除非对变量加上mutable修饰符。
5. 当const 和 non-const 成员函数实现相同时,让non-const 调用const(使用cast) 来避免代码重复。

Item 4: Make sure that objects are initialized before they’re used.

1. C++规定,对象的成员变量的初始化应发生在进入构造函数本体之前,在构造函数体内的不叫初始化,而叫赋值。
2. 对于内置类型的初始化,应使用初始化列表。
3. 如果不在进入构造函数本体之前进行初始化,而直接在构造函数体内进行赋值,则会调用一次成员变量的默认构造函数和一次拷贝构造函数,造成了浪费。
4. 初始化顺序:父类早于子类。类成员按声明顺序初始化(即使初始化列表的顺序不一样,但应尽量保持和声明一样的顺序)。
5. 函数内的static变量称为local static,其它区域的static变量称为non-local static
6. 不同编译单元(生成一个目标文件的代码)的non-local static变量的初始顺序不确定,当有相互引用时,应使用Singleton模式。
7. 任何一种non-const的static对象,在多线程环境下等待某事发生都会有麻烦。一种处理办法是在单线程启动阶段,手工调用。(类似的,ios中单例模式,使用dispatch_once来保证)

Itme 5:

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