兩類典型二義性:
1. 類型轉換二義性:A 有構造函數 `A(const B&)`,B 有轉換運算符 `operator A()`。調用 `f(A)` 時傳入 B 對象,編譯器不知用哪條路徑。
2. 重載決議二義性:`f(int)`, `f(char)` 同時存在,傳入 `double` 時無法決定轉向哪個。
3. 多繼承同名成員:基類有同名函數/數據,派生類必須顯式指定基類名消除二義性,不考慮訪問權限(私有也會二義性),因改變權限不應改變程序含義。
編譯器會隱式生成:默認構造、拷貝構造、拷貝賦值、析構。若類不應被拷貝(如含原始指針、文件句柄),必須聲明為 private 且不定義,或繼承 `NonCopyable`(boost::noncopyable)。
私有聲明防止外部調用,不定義導致鏈接錯誤捕獲內部誤用(成員/友元仍可調用聲明)。
使用 namespace 避免命名衝突。三種用法:
- `using namespace ns;` 整體引入
- `using ns::name;` 單一引入
- `ns::name` 顯式限定
也可用 `struct` 模擬:`struct Ns { static const int VAL; class A{...}; };`,訪問 `Ns::VAL`、`Ns::A`。
類型可 `typedef Ns::A A;`,函數可返回指針/引用別名。