让自己习惯C++
01.视c++为一个语言联邦
-
C
-
Object-Oriented C++
-
Template C++
-
STL
C++ 高效编程守则视状况而变化,取决于你使用C++的哪个部分
02.尽量以const, enum, inline 替换#define (以编译器替换预处理器)
- 对于单纯常量,最好以const对象或是enums替换#defines
- 对于形似函数的宏(macros), 最好改用inline函数替换#defines
03.尽可能使用const
-
如果关键字const 出现在星号左边,表示被值物为常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量.
-
如果被指物是常量,可以将const写在类型前面,亦可以写在类型之后,星号之前.
void f1(const Widget* pw); void f2(Widget const * pw); // 函数获得一个指针,指向一个常量的Widget对象
-
STL迭代器的作用就像个T*指针,声明迭代器为const就像声明指针为const一样(即声明一个T * const 指针),表示这个迭代器不得指向不同的东西,但他指向的值是可以改动的.
std::vector<int> vec; const std::vector<int>::iterator iter=vec.begin(); // iter的作用就像T* const *iter = 10; // 没问题,改变iter所指物 ++iter; // 错误,iter是const
-
如果希望迭代器所指的东西不可被改动(const T*), 需要的是const_iterator:
-
std::vector<int>::const_iterator cIter = vec.begin(); // cIter的作用像个const T* *cIter = 10; // 错误,*cIter是const ++cIter; // 没问题,改变cIter.
**注意: **
- 将某些东西声明为const可帮助编译器侦测出错误用法.const可被施加于任何作用域内的对象,函数参数,函数返回类型,成员函数本体.
- 编译器强制实施bitwise constness, 但你编写程序时应该使用"概念上的常量性"
- 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复.
04.确定对象被使用前已先被初始化
-
永远在使用对象之前先将它初始化,对于无任何成员的内置类型,你必须手动完成此事.
int x = 0; const char* text = "A C-style string"; double d; std::cin >> d;
-
对于内置类型意外的任何其他东西,初始化的责任落在构造函数身上.规则很简单:确保每一个构造函数都将对象的每一个成员初始化.
-
**注意: **
-
为内置型对象进行手工初始化,因为C++不保证初始化它们.
-
构造函数最好使用成员初值列表,而不要在构造函数本体内使用赋值操作.初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同.
-
为免除"跨编译单元值初始化次序"问题,请以local static对象替换non-local static对象.
-
-