typedef long INDEX 給long這樣的類型起別名,它有兩個用處:一是表明該類型的特殊作用,二是將來有可能要改變這種類型(比如提高精度),
但是現在了解到可以在class類里面使用(并且還有public,PRivate之分哦) C++引入“僅在類內部起作用的類型別名”的初衷應該不難理解:通過限制該類型別名的作用域來防止沖突。在函數體內部typedef,這個別名在函數體以外不可以使用,也就是說,“類型別名”和變量、函數一樣具有作用域。c中有了#define 為什么還要typedef就是為了增強安全和健壯性
隨便記錄下c中的常量(#define pi = 3.14)和c++中的常量(const double pi = 3.14),前者只是簡單的替換,后者還要經過一系列的編譯器的安全檢查的, 這也是增加了安全性
我也試了試 #define 是否可以再class類里面使用, 結果是可以的, 但是#define是沒有作用域的, 也沒有什么public, private之分的, 就相當于一個全局的變量, 什么都可以使用class MyClass{public: typedef long INDEX;...}; 如果該語句放在public段中,則可以在類外部使用,比如:MyClass::INDEX usercode;//聲明一個變量 而如果放在private段中,則只能在類內使用。 以往我也經常用typedef,但是從來沒有在類里面用過。今天算是學了一招了。C++引入“僅在類內部起作用的類型別名”的初衷應該不難理解:通過限制該類型別名的作用域來防止沖突。比如同樣表示長度,可能有的類中只須char即可,有的類中要用int,而有的類可能連long都嫌小。那么,我一概起個別名叫“size”,不同的類中有不同的定義。于是,下面的聲明語句就足以避免沖突而且易于理解:MyClass::size MyClass::GetSize() const; 進而,我試驗了一下在函數體內部typedef,果然這個別名在函數體以外不可以使用,也就是說,“類型別名”和變量、函數一樣具有作用域。 至此,我們可以回過來考慮一下,為什么C++有了“#define”還要“typedef”。過去我始終沒有細想過這個原因。原來這樣做是為了安全性與健壯性。 這里,我聯想到了const,C語言中沒有常量這個概念,如果要用常量,就用“#define pi 3.14”這種形式,但是C++有了“const double pi = 3.14;”雖說繼續用前者一樣可以寫出程序,但這等于放棄了編譯器的安全檢查。 “#define”產生的效果在編譯之前就起作用了,所有的pi都被替換成了3.14這樣一個“立即數”,立即數是沒有類型的,于是,在程序編寫過程中不可能給予合適的提醒,在程序的編譯中也可能產生意想不到的副作用。const將常量作為有類型的數據進行有效管理,既提供了常量的優點,也給予了足夠的安全性。而且,const常量是有作用域的,在程序的不同位置可以給予不同精度的pi。
新聞熱點
疑難解答
圖片精選