view c++ as a federation of languages
把C++语言,当成是一个由多个次语言subLanguage 所组成的 federation 联邦,而不是单个编程语言!! 这些次语言有:
- C语言(内置数据类型、指针、预处理、数组)
- 面向对象编程(class、继承、virtual)
- Template泛型
- STL
对于C-like内置类型(int、指针),用 ( int a, int * p) pass-by-value 要好。 对于C++的class,则使用(const T &) pass-by-ref-const 要好。
因为STL里的 迭代器和函数对象,本质是使用的C指针。所以,对于STL的迭代器和函数对象,用pass-by-value 要好。
prefer const/enum/inline to #define
#define PI 3.14 这样的缺点是: 假如出了问题,编译器进行Debug时,就会是:3.14 .... 因为,PI并没有进入symbol table符号表 。
最好是用: const double PI = 3.14; ,用const常量 来替代 #define,这样 出了问题,编译器会提示PI ... ,而不是3.14 ...
class ST{
static const int N = 100;
int A[ N ];
}
假如说,编译器不允许 static const int 在 类内初始化 = 100 ,此时A[N] 就会出错。 有个补救办法是:
enum { N = 100 };
int A[ N ];
enum 很多行为 类似#define,比如(&N)这是不允许的!! 这等价于:(&100)
对于常量,最好使用const对象 或 enum,来替代#define
#define MAX(a,b) (a > b ? a : b) 这种写法 非常不好。 不要对复杂函数进行宏定义,让宏定义只负责简单的 文本替换。
应该写成:
template< typename T >
inline T MAX( const T & a, const T & b ){
return a > b ? a : b;
}
宏:MAX(++a, ++b) 他会变成:(++a) > (++b) ? (++a) : (++b) ,导致 a和b 都++了 2次!! 而函数的话,到了函数参数这一步,此时参数列表里的ab就固定了,就++了1次。
对于#define宏,最好使用inline函数!!
因此,用const, enum, inline 尽量来替代 #define !!! 当然,对于#include #ifdef 这些仍然是必需品。
use const whenever possible
- 请尽量使用const,会帮助编译器检测出错误的行为!! 是一个非常方便实用的助手。
const可作用域: 变量/对象、函数返回值、函数参数、成员函数 - 编译器强制对const 实施:
bitwise(按位) constness ,他不允许对对象的每一个bit内存 进行修改。 他很简单,不允许对该对象 及其成员变量,进行 赋值操作。C++对常量const的定义,就是bitwise const
class ST{
public:
int a = 123;
int * p = &a;
void func() const {
*p = 888;
}
};
|