以前學習c語言時,老師教導我們,對於數字最好用宏(#define)來定義它。以至於 一直習慣於#define Age 12這樣的寫法。
在c語言的環境中,這確實是增加程序可讀性的有效做法,可是在c++中,可以有更優 美的實現方式。
1.當你寫下
#define NUMBER 11.12
如果接下來使用NUBMER時出現了編譯錯誤,那麼由於在預處理過程中NUMBER已經被替 換為11.12了,編譯器指出錯誤發生在11.12上,如果使用者不是你,肯定會對11.12感到 莫名其妙,要花不少時間追蹤它。
替換方法有:
const double Number = 11.12;
這樣一來,錯誤定位肯定沒有問題了,而且如果多次使用這個常量,宏替換會產生多 份11.12,而後者保證只有一個副本。
2.我以前寫過這樣的宏替換代碼:
#define MAX(a, b) ((a) > (b) ? (a):(b)) //得到兩個數中的最大值
在每個變量外都加了括號以後,使用起來確實沒碰到過什麼問題。可是作者這樣使用 這個函數:
int a = 5, b = 0;
MAX(++a, b); //a會被遞增兩次
MAX(++a, b+10); //由於b+10>a,a只被遞增一次!!
會出現很大的問題!
在c++中,可以使用inline函數來解決:
template <typename T>
inline T MAX(const T& a, const T&b)
{
return a > b ? a : b;
}
使用reference-to-const可以確保不對對象進行修改;而inline函數本身可以在編譯 時進行優化,提高編譯速度。
Note:
1.對於一般常量,最好用const和enum替換#define;
2.對於類似函數的宏,最好改用inline函數替換#define。