1. 程式人生 > >c++ 類中typedef的類型別名的作用

c++ 類中typedef的類型別名的作用

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。