1. 雙冒號 :: (作用域解析運算符)
核心用法
| 場景 | 示例 | 說明 |
| 類外定義成員 | `void A::func() {}` | 指明 func 屬於類 A |
| 訪問靜態成員 | `A::staticVar` | 無需對象實例 |
| 訪問嵌套類型 | `A::NestedType` | |
| 全局作用域 | `::globalFunc()` | 區分同名局部/全局 |
| 命名空間 | `std::vector` | |
| 基類成員 | `Base::func()` | 在派生類中調用被覆蓋的基類版本 |
經典陷阱:全局 vs 成員
int x = 10;
void foo() {
int x = 20;
cout << x; // 20 (局部)
cout << ::x; // 10 (全局)
}
2. 冒號 : (多重語境)
| 語境 | 示例 | 說明 |
| 繼承聲明 | `class Derived : public Base` | 指定繼承方式 |
| 構造函數初始化列表 | `A() : x(0), y(1) {}` | 直接初始化成員,const/引用必須用此法 |
| 位域聲明 | `unsigned int a : 4;` | 指定佔用位數 |
| 訪問控制 | `public:` `private:` | 後續成員屬於此訪問級別 |
| 標號 | `label: statement;` | 配合 goto 使用 |
| 三元運算符 | `cond ? a : b` | 條件表達式 |
| 範圍-based for (C++11) | `for (auto& x : vec)` | 遍歷容器 |
初始化列表 vs 賦值
class A {
const int x;
int y;
public:
A(int a) : x(a), y(a) {} // 正確:初始化 const x
// A(int a) { x = a; y = a; } // 錯誤:const 不能賦值
};
3. 點號 . (成員訪問)
- 用於對象實例或引用訪問成員:`obj.member`、`ref.member`
- 結構體/類/聯合體通用
4. 箭頭 -> (指針成員訪問)
- 用於指針訪問成員:`ptr->member` 等價於 `(*ptr).member`
- 智能指針 (`unique_ptr`, `shared_ptr`) 重載了 `->`,用法相同
核心區別速記
A obj; // 對象
A* ptr = &obj; // 指針
A& ref = obj; // 引用
obj.func(); // . 訪問對象
ref.func(); // . 訪問引用
ptr->func(); // -> 訪問指針
(*ptr).func(); // 等價
A::staticFunc(); // :: 訪問靜態/類級別
優先級與結合性
`::` 最高 (單目),`->` `.` 其次 (左結合),`:` 在特定語境中非運算符。三元 `? :` 優級極低,右結合。
常見錯誤集錦
- `ptr.func()` → 應為 `ptr->func()`
- 構造函數體內賦值 const 成員 → 應用初始化列表 `:`
- 忘記 `::` 定義類外成員函數 → 編譯錯誤
- 三元運算符優先級導致邏輯錯誤 → 加括號 `(cond ? a : b)`