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

C++ 類別成員存取權限詳解

     編輯:C++ 基礎

三大存取指定符

關鍵字中文類外(透過物件)可存取類內可存取繼承類可存取
public公有✅✅✅
protected受保護❌✅✅
private私有❌✅❌

本文聚焦 public/private,protected 留待繼承章節深入。

核心規則

  • 類內部:無視存取指定符,所有成員互相可存取。
  • 類外部:僅能透過物件存取 public 成員;private/protected 不可直接存取。

實戰範例:Student 類別封裝

class Student {
private:               // 內部實現細節
    char* m_name;
    int m_age;
    float m_score;
public:                // 對外介面
    void setName(const char* name);
    void setAge(int age);
    void setScore(float score);
    void show() const;
    // 讀取器(getter)
    const char* getName() const { return m_name; }
    int getAge() const { return m_age; }
    float getScore() const { return m_score; }
};

// 類外定義
void Student::setName(const char* name) { m_name = name; }
void Student::setAge(int age) { m_age = age; }
void Student::setScore(float score) { m_score = score; }
void Student::show() const {
    cout << m_name << " 年齡 " << m_age << " 成績 " << m_score << endl;
}

int main() {
    Student stu;
    stu.setName("小明");  // ✅ 透過 public 介面修改 private 資料
    stu.setAge(15);
    stu.setScore(92.5f);
    stu.show();
    // stu.m_name = "錯誤"; // ❌ 編譯錯誤:private 不可類外存取
    return 0;
}

命名慣例:m_ 前綴

成員變數慣用 m_ 前綴(m_name、m_age),優點:

  1. 一眼識別成員變數與區域變數/參數。
  2. 避免參數與成員同名導致遮蔽(name = name 錯誤)。
  3. 配合 this->m_name 更清晰。

封裝:隱藏實現、暴露介面

封裝 = private 資料 + public 介面。優勢:

  • 資料驗證:setAge 可檢查 age > 0。
  • 實現變更:內部改用 std::string,外部介面不變。
  • 唯讀控制:僅提供 getter 無 setter 實現不可變資料。

雖然將資料設為 public 「99.9% 情況下能跑」,但中大型專案**強烈建議**遵循封裝規範:資料預設 private,行為視需求 public。

存取指定符的排列與重複

  • 順序任意:可先 private 後 public,或交替出現。
  • 重複允許:private: ... private: ... 合法,但**建議每種指定符僅出現一次**,保持結構清晰。
  • 預設為 private:若類別開頭無指定符,成員預設私有(struct 預設 public)。

常見誤區

  • ❌ 以為 private 成員「完全不可見」:類內、friend 可見,繼承類不可見但佔記憶體。
  • ❌ 將所有函數設為 public:內部輔助函數應 private,減少介面面積。
  • ❌ 忽略 const 搭配:getter 應標記 const,允許常物件呼叫。

總結

存取權限是 C++ 封裝機制的語法基石。public 定義契約,private 隔離實現,protected 服務繼承。養成「資料私有、介面公開、必要時提供 getter/setter」習慣,能構建高內聚、低耦合、易維護的類別。

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