| 層面 | 型別別名 | 物件別名 |
|---|---|---|
| 目的 | 為既有型別取新名字 | 為既有物件取新名字 |
| 關鍵字 | typedef / using (C++11) | & (參考/引用) |
| 實體 | 編譯期概念,不佔記憶體 | 執行期綁定,同一記憶體位址 |
| 可變性 | 不可變(別名即型別) | 綁定後不可重新綁定 |
// 傳統 typedef
typedef int Integer;
typedef void (*FuncPtr)(int);
// C++11 using(語法更清晰,支援模板別名)
using Integer = int;
using FuncPtr = void(*)(int);
template<typename T> using Vec = std::vector<T>;
// Vec<int> 即 std::vector<int>
using 優勢:讀寫順序符合直覺、支援模板別名、與 auto 風格一致。現代 C++ 建議全面改用 using。
int x = 10;
int& ref = x; // ref 是 x 的別名
ref = 20; // x 變為 20
// 參考必須初始化,且一生綁定同一物件
參考不是物件,無記憶體位址(編譯器通常用指標實作),sizeof(ref) == sizeof(x)。
using People = MyNamespace.Human; // 型別別名
// C# 無 typedef,也無參考語意的別名(ref/out 僅用於參數傳遞)
typedef char* PChar;
const PChar p1 = "hello"; // 等價 char* const p1:指標常數,指向可修改
// 非 const char* const p2:指向常數字元的指標
using PChar = char*;
const PChar p3 = "hello"; // 同上,using 不改變語意
口訣:const 修飾的是左邊最近的型別;若左邊無型別則修飾右邊。typedef/using 定義的名稱視為單一型別實體,const 整體套用。
using 定義公開型別別名(如 using Handle = void*;)。using 簡化複雜型別(using Map = std::unordered_map<Key, Value>;)。T&,唯讀用 const T&,避免拷貝。typedef 定義指標型別(如 typedef Node* PNode;),隱藏指標語意易誤用;改用智慧指標或直白寫 Node*。