1.條款01:視C++語言為一個聯邦
C++語言的四大部分主要如下圖所示:

這也是對問題C語言和C++語言有什么不同? 的最佳回答之一,
條款02:盡量以const,enume,inline,替換#define
如下的一個定義:
#define RATIO 1.6352
對于預編譯的的變數,并不會進入到符號表中,當程式報錯時可能對反饋資料1.6352出錯,而不是RATIO變數,所以C++語言中用以下陳述句代替,
const double Ratio = 1.6352;
作為常量,Ratio將會進入符號表,且所有的機器碼中出現的也將是Ratio,而不是1.6352;
兩種特殊情況:
- 1
定義常量指標時,我們一搬用string物件代替char *;
這樣需要兩次使用const,且代碼的可讀性不強,一幫用const char * const Name="Scott";
來代替上述定義,const std::string Name("Scott"); - 2
對于類專屬的常量,我們一般將其宣告為const常量,為了保證該常量只有一個物體,我們需要將該常量宣告為static類,
class A
{
private:
static const int Num=5;
///......
}
有些編譯器不能在宣告static變數時進行賦值,所以需要在實作檔案中定義,
class A
{
private:
static const int Num;
///......
}
//實作檔案中初始化
const int A::NUm=;
因為#define沒有作用區域,所以不能用#define為類宣告專屬變數,
enum hack
上述的程式當我們在類外初始化靜態成員,但是我們在類的需要用到該數,那么這個時候就會報錯,
class A
{
private:
static const int Num;
int arr[Num];//錯誤,Num沒有初始化
}
//實作檔案中初始化
const int A::NUm=5;
為了解決上訴的情況,我們可以用enum hack技術,即我們可以用enum型別宣告的成員代替int類的常量,
class A
{
private:
enum{ Num=5 };
int arr[Num];
///......
};
用enum hack更能接近#define的功能,因為enum和#define通常都是不能取地址的,這樣別人就不能獲得專屬常量的指標或者參考,而且enum hack是模板編程技術的基礎,
用inline代替宏函式
對于宏函式,C語言中用來節省函式呼叫的開銷,但是宏函式的呼叫容易產生錯誤,
#define MAX(a,b) (a)>(b)?(a):(b)
即使加上括號,這個宏函式依然是不安全的,
int a=5,b=0;
MAX(++a,b); //a被累加兩次
MAX(++a,b+10);//a被累加一次
為了避免宏函式帶來的不安全,一般會用inline和模板編程實作上述函式,
template<typename T>
inline int Max(const T& a,const T& b)
{
return a>b?a:b;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/266332.html
標籤:其他
