首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ typedef 與指標別名解析:Node、Link、List::choose() 完整解釋

     編輯:程式設計疑難解答

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 vs using (C++11 推薦)

// 舊式 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 A B` → **B 是 A 的別名**,出現 B 的地方心裡替換成 A
  • `Node *` → **指向 Node 的指標**,`typedef Node *Link` 後,**Link 就是 Node\***
  • `Class::member` → **member 屬於 Class**,類別外定義/存取靜態成員/命名空間都用 `::`

掌握 `typedef`/`using` 別名機制、指標型別組合、`::` 域解析三大基石,C++ 類別與指標宣告即可隨心所欲。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved