:: 是 C++ **作用域解析運算子** (Scope Resolution Operator),用於指定識別元素所屬的作用域。本文系統整理四大核心用法:**類別成員定義**、**命名空間存取**、**全域識別元素消歧**、**靜態成員/巢狀類型存取**,並附贈實務範例與常見錯誤。
// MyClass.h
class MyClass {
public:
void func(int x); // 宣告
static int s_value; // 靜態成員宣告
};
// MyClass.cpp
void MyClass::func(int x) { // :: 指定 func 屬於 MyClass
// 實作
}
int MyClass::s_value = 0; // 靜態成員定義 (必須在類外)
ClassName::。
namespace MyLib {
namespace Detail {
void internalFunc();
}
void publicFunc();
}
void MyLib::Detail::internalFunc() { } // 定義巢狀命名空間函數
void use() {
MyLib::publicFunc(); // 完整限定名稱
using MyLib::Detail::internalFunc; // using 宣告引入
internalFunc(); // 簡短名稱
}
int value = 10; // 全域變數
class Test {
int value = 20; // 成員變數
void func() {
int value = 30; // 區域變數
value = 1; // 區域 value
this->value = 2; // 成員 value
::value = 3; // **全域 value** (前置 ::)
}
};
::name 強制查找**全域命名空間**。::CreateWindow(...)、::SendMessage(...)。CWnd::GetWindowText vs ::GetWindowText (API)。
class Config {
public:
static const int MAX_COUNT = 100;
enum class Mode { Fast, Safe };
struct Options { int timeout; };
};
void foo() {
int n = Config::MAX_COUNT; // 靜態常數
Config::Mode m = Config::Mode::Fast; // 巢狀列舉 (C++11 scoped enum)
Config::Options opt; // 巢狀類型
opt.timeout = Config::MAX_COUNT;
}
template
class Base {
public:
static void helper() { }
};
template
class Derived : public Base {
public:
void func() {
Base::helper(); // 依賴基類模板參數,需完整限定
// 或 this->helper() (延遲查找)
}
};
| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
void MyClass::func() { } 在 .h 中定義 | 導致多重定義 (多檔包含) | 定義移至 .cpp,或加 inline |
class A { static int s; }; int A::s; 遺漏 | 連結錯誤 LNK2001 | 在單一 .cpp 定義 int A::s = 0; |
成員函數呼叫同名全域函數未加 :: | 遞迴呼叫自己 / 編譯錯誤 | ::GlobalFunc() |
using namespace std; 後仍寫 std::vector | 冗餘但合法 | 視團隊風格統一 |
:: 是 C++ 靜態作用域導航的核心工具:**類外定義成員**、**跨命名空間存取**、**全域名稱消歧**、**靜態/巢狀實體存取**。熟練運用 :: 能消除命名衝突、提升程式碼可讀性、正確對接 Win32 API 與第三方庫。記住:**前置 :: = 全域**、**類別/命名空間 :: = 該作用域成員**。