尽可能使用const
Chargreeting[] = “Hello”;
Char*p = greeting; //non-constpointer, non-const data
Constchar* p = greeting; //non-constpointer, const data
Char*const p = greeting; //constpointer, non-const data
Constchar* const p = greeting //const pointer, const data
inta[5] = {1,2,3,4,5};
vector<int>vec;
vec.assign(a,a+sizeof(a)/sizeof(int));
constvector<int>::iterator iter = vec.begin(); //iter的作用像个T* const
*iter= 10; //没问题,改变iter所指物
// ++iter; //错误! iter是const
vector<int>::const_iteratorcIter = vec.begin(); //cIter的作用像个const T*
// *cIter= 10; //错误! *Iter是const
++cIter; //没问题,改变cIter
REMEMBER:
将某些东西声明为const可帮助编译器侦测出错误用法。Const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。
编译器强制实施bitwiseconstness,但你编写程序时应该使用“概念上的常量性”(conceptual constness)。
当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。
构造函数最好使用成员初值列(memberinitialization list),而不要再构造函数本体内使用赋值操作(assignment)。初值列列出的成员变量,其排列次序应该和他们在class中的声明次序相同。
为免除“跨编译单元之初始化次序”问题,请以localstatic对象替换non-local static对象。