首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 技巧:以 #define 存取類別私有成員

     編輯:關於C++

原理

C++ 編譯器在前置處理階段處理 #define。若在類別定義之前定義:

#define private public
#define protected public

class ClxECS {
private:
    int iPrivate; // 經前置處理器展開為 public
};

// 現在可直接存取
void ECS_test() {
    ClxECS obj;
    obj.iPrivate = 13; // 編譯通過
    cout << obj.iPrivate << endl;
}

⚠️ 嚴重警告

  • 破壞封裝性:繞過編譯器存取控制,導致類別不變條件失效。
  • 未定義行為風險:物件記憶體佈局可能依賴 private/protected 排列順序,強制存取可能導致相容性問題。
  • 僅限極特殊情況:除錯舊版程式庫、單元測試私有邏輯、第三方庫無原始碼且無公開介面時的權宜之計。
  • C++ 標準不保證:此行為屬於實作定義,跨編譯器/版本可能失效。

正規替代方案

  1. 友元類別/函式:friend class Tester; 明確授權。
  2. 公開存取器:getter/setter 維護封裝邊界。
  3. 受保護介面:衍生類別透過 protected 存取。
  4. 序列化/反射庫:如 Boost.Serialization、Qt 元物件系統。

結語

技術可行 ≠ 應該使用。理解原理有助於除錯與面試,實務開發請堅持封裝原則,善用 C++ 提供的正規機制。

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