主題?C++
這個條款也可以改為“可以用編譯器替換預處理器”,因為#define有很多的問題和不方便之處宇驾。
#defineASPEC 1.6454
當你使用了這個常量但獲得一個編譯錯誤信息時,可能會帶來困惑隙畜,因為錯誤信息會提到1.6454 而不會提到名稱本身椎咧,尤其是這個量又別人或在另外一個頭文件中定義就更麻煩了。
而改為?const double ASPEC = 1.6454?就不會出現這種情況沸柔。
當const、指針結合在一起時應該注意‘*’與const的相對位置铲敛;
另一個要注意的問題是如果你想在class中設立這樣一個作用域為這個類的變量褐澎,則讓它成為一個static成員:
classG{staticconstintnum=5;intsc[num];};
然而,num是常量的聲明式而非定義式伐蒋,通常C++要求你對你所使用的任何東西提供一個定義式工三。
但如果它是一個class專屬常量又是static,且為整數類型(integral type先鱼,例如int俭正,char,bool)焙畔,則需特殊處理掸读。
只要不取它們的地址,你可以聲明并使用它們而無須提供定義式宏多。
但如果你取某個class專屬常量的地址儿惫,或縱使你不取其地址但是編譯器卻(不正確的)堅持要看到一個定義式,
你就必須另外提供定義式如下:
constintG::num;
·#define是不提供任何封裝的绷落,也就是說沒有private #define之類的東西姥闪,但是const可以。
另一個好用的東西是enum hack.像在類中加入下面的代碼:
enum{Nun =5};
用Nun作為5的一個代稱砌烁,而且可以避免用指針來獲取你的整數常量的地址筐喳,enum可以完成這個約束。而且它很實用函喉,經常會用到避归。
看我主頁簡介免費C++學習資源,視頻教程管呵、職業(yè)規(guī)劃梳毙、面試詳解、學習路線捐下、開發(fā)工具
每晚8點直播講解C++編程技術账锹。