這一條款也被稱作:寧可用編譯器替換前置處理器。從以下幾方面說明:(最開始的那一段似乎跟編譯原理有關,我是不懂的,就不說了):
對於一般用#defined定義的常量,可以使用const類型代替。
但是要注意兩種特殊情況:假如我們要在標頭檔中定義一個不能被修改的字串,那麼需要使用const char* const類型的指標:
char a = 'A';char b = 'B';char* const pa1 = &b;//pa1 = &a;表明指標的指向不能變*pa1 = 'C';//可以改變指標指向對象的值const char* pa2 = &a;//*pa2 = 'B';指標指向的對象是常量,不能修改pa2 = &b;//可以改變指標的指向const char* const cptr = "const";//此時,不論是指標的指向還是指標指向的對象值都不能修改
第二種情況是與類有關的。你無法通過#define來確定一個有範圍的常數,但是可以用static const來完成。比如你定義了數組長度為5,可以這樣做。在標頭檔中:
class Test{private://記錄整個所有Test類型對象調用fun函數的次數static int times;//數組的長度static const int arraySize = 5;public:void fun(){std::cout<<++times<<std::endl;}int Array[arraySize];};
這裡還有static int times變數的原因是因為它們的聲明、定義完全不同!在對應的源檔案中,只有
#include "item2.h"int Test::times = 0;//const int Test::arraySize;
也就是說,對於一般的staic變數(這裡是times),是在標頭檔中聲明它是static,而在源檔案中定義的;而對於static const變數,假如這個變數是“整數”類型:int,char,bool,那麼直接就可以直接聲明,而不用定義。
#define除了定義一些常量之外,使用#define定義宏,也可以節省函數調用的開銷:
#define FIND_MAX_VALUE(a,b) (a) > (b) ? (a) : (b)
然後就可以:
int a = 10,b = 5;int c = FIND_MAX_VALUE(a,b);
但是這樣做有一個致命的問題:
int c = FIND_MAX_VALUE(++a,b);後c為12;而int c = FIND_MAX_VALUE(++a,b+10);後c為11!這是一件多麼令人驚奇的事啊!所以,為了防止出現這種亂子,c++提供了內嵌函式,這種函數在調用時,會在調用點展開,開銷比較小。
簡而言之:如果是#define常量,用const替換;如果是為了定義類似函數的宏,則用內嵌函式替換。