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

Effective C++ 條款 22:將成員變量聲明為 private 的深層理由

     編輯:C++ 入門

核心觀點

切記將成員變量聲明為 private。 這不僅是封裝的體現,更賦予了類設計者對實現細節的完全控制權。

三大核心理由

1. 語法一致性:統一訪問語法

若成員變量為 public,客戶代碼需區分「讀取變量」和「調用函數」:

class AccessLevels {
public:
    // 無訪問:完全隱藏
    // int noAccess;  // 無 getter/setter
    
    // 只讀:僅提供 const getter
    int getReadOnly() const { return readOnly; }
    
    // 讀寫:提供 const getter + 非 const setter
    int getReadWrite() const { return readWrite; }
    void setReadWrite(int v) { readWrite = v; }
    
    // 唯寫:僅提供 setter(罕見但可行)
    void setWriteOnly(int v) { writeOnly = v; }
    
private:
    int noAccess;
    int readOnly;
    int readWrite;
    int writeOnly;
};

這種細粒度控制對不變量維護、線程安全、數據驗證至關重要。

3. 實現彈性:封裝帶來的修改自由度

若 data 為 public,未來想改為「計算得出」或「添加日誌/驗證/同步」,所有客戶代碼都會崩潰。

// 貧血模型:只有數據無行為,業務邏輯散落在服務層
class Order {
public:
    int id;
    double amount;
    int status;  // 0=新建 1=支付 2=發貨 3=完成
};

// 業務邏輯分散,難以維護狀態機不變量
void pay(Order& o) { if(o.status==0) o.status=1; }
void ship(Order& o) { if(o.status==1) o.status=2; }

充血模型:封裝狀態機,保證不變量:

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