條款1:視C++爲一個語言聯邦編程
一、C、Object-Oriented C++、Template C++ 、STL 組成了C++,高效編程取決你使用C++的哪一部分安全
條款2:儘可能用const ,enum,inline替換 #define函數
一、Const 代替 #define中普通的宏,編譯器會對類型進行檢查避免類型錯誤。spa
//如這裏 #define PI 3.1415 //最好用const代替,一旦定義錯了define只會對3.1415進行提示,而不會對PI進行提示,由於在預處理的時候PI已經被3.1415代替了 Const double PI=3.1415
二、inline 代替#define中形似函數的宏,贊成能夠避免宏定義錯誤指針
//這樣定義不安全 #define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b)) //採用inline template<typename T> inline T callWithMax(const T& a,const T& b) { return a>b?a:b; }
三、類中有const 必需要有static,有const就表示該屬性是隻有一份因此必須也是靜態的code
Class C { static const int pi; }
四、若是不容許類中static初始化,那麼用enum代替對象
//舊的編譯器不支持static在聲明時得到初值 Class C { private: static const double PI; }; const double C::PI=3.14159; //因此用這種方式來定義靜態變量 Class C { private: enum{num=5}; };
五、Ifdef/ifndrf 能夠防止類被重複引用blog
#ifdef _TEST_ #define _TEST_ int max(int a,int b); #endif
條款3:儘可能使用const隊列
一、Const出如今星號左邊,被指物是常量。右邊指針自身是常量編譯器
char greeting[]="hello" //值常數 const char* p=greeting; //指針常數 char* const p =greeting; //指針和值都是常數 const char* const p=greeting;
二、Const定義迭代器錯誤,應該使用const_iteator
std::vector<int> vec; const std::vector<int>::iterator it=vec.begin(); *it=10; //錯誤 迭代器自己是常量 ++it; std::vector<int>::const_iterator it=vec.begin() //錯誤,該迭代器指向的值是常量 *it=10; ++it;
三、函數返回 const 可避免無心義的賦值動做
條款4:肯定對象使用以前已先被初始化
一、 永遠在對象使用以前初始化
二、 類中初始化不要用構造函數賦值的形式,要使用成員初值列
class C { int a; int b; int c; //初始化隊列 C(int x,int y) :a(x), b(y), c(1) { } };