C++ 初學者常對 `typedef class List Node`、`typedef Node *Link`、`List::choose()` 等語法感到困惑。本文逐行拆解類別定義、typedef 機制、指標別名、域解析運算子 `::` 的含義。
#include
using namespace std;
class List {
public:
int num;
class List *next; // 結構體內自我引用,前面加 class 兼容 C 風格
void create();
};
typedef class List Node; // 1. 給 "class List" 取別名 "Node"
// C++ 中 class List 已自動產生型別名 List
// 這行等同於: typedef List Node;
// 寫不寫 class 都可以,效果相同
typedef Node *Link; // 2. 給 "Node*" 取別名 "Link"
// Link 現在代表 "指向 Node 的指標"
// 星號 * 屬於型別的一部分,表示指標
Link top, p, s; // 3. 宣告三個 Link 型別變數
// 等同於: Node *top, *p, *s;
// 都是指向 Node 的指標
void List::choose() { // 4. 域解析運算子 ::
// 定義屬於 List 類別的 choose 成員函式
// 相當於在 class List 內部寫: void choose() { ... }
// 但在類別外部定義時,必須加上 "List::" 告訴編譯器這是 List 的成員
} // :: 叫「域解析運算子」或「範圍解析運算子」
| 代碼 | 含義 | 等價寫法 |
|---|---|---|
| `typedef class List Node;` | 為 `class List` 取別名 `Node` | `typedef List Node;` (C++ 慣用) |
| `typedef Node *Link;` | 為 `Node*` 取別名 `Link` | `using Link = Node*;` (C++11 別名模板) |
| `Link top, p, s;` | 宣告三個 `Node*` 指標 | `Node *top, *p, *s;` |
| `void List::choose()` | 定義 `List` 類別的 `choose` 成員函式 | 類別內直接寫 `void choose()` |
// 舊式 typedef
typedef int Int32;
typedef Node* Link;
typedef void (*FuncPtr)(int);
// 新式 using (更易讀、支援別名模板)
using Int32 = int;
using Link = Node*;
using FuncPtr = void(*)(int);
// 別名模板 (typedef 做不到)
template
using Vec = std::vector;
Vec vi; // std::vector
| 場景 | 例子 | 說明 |
|---|---|---|
| 類別外定義成員函式 | `void List::choose()` | 告訴編譯器 `choose` 屬於 `List` 類別 |
| 類別外定義靜態成員變數 | `int List::count = 0;` | 靜態成員必須在類別外定義一次 |
| 存取命名空間成員 | `std::cout`, `std::endl` | `std` 是命名空間,`::` 取其成員 |
| 存取巢狀類別/列舉 | `Outer::Inner`, `Color::Red` | 巢狀型別需加外層作用域 |
| 呼叫基底類別成員 | `Base::func()` | 在衍生類別中顯式呼叫基底版本 |
| 全域作用域 | `::func()` | 前面無名稱表示全域命名空間 |
#include
using namespace std;
class List {
public:
int num;
List *next = nullptr; // C++11 直接初始化
void create() { /* 建立節點邏輯 */ }
};
using Node = List; // 現代別名
using Link = Node*; // 指標別名
Link top = nullptr, p = nullptr, s = nullptr;
void List::choose() {
cout << "List::choose() called, num=" << num << endl;
}
int main() {
// 簡單測試
top = new Node();
top->num = 42;
top->choose(); // 輸出: List::choose() called, num=42
delete top;
return 0;
}
掌握 `typedef`/`using` 別名機制、指標型別組合、`::` 域解析三大基石,C++ 類別與指標宣告即可隨心所欲。