| 關鍵字 | 中文 | 類外(透過物件)可存取 | 類內可存取 | 繼承類可存取 |
|---|---|---|---|---|
public | 公有 | ✅ | ✅ | ✅ |
protected | 受保護 | ❌ | ✅ | ✅ |
private | 私有 | ❌ | ✅ | ❌ |
本文聚焦 public/private,protected 留待繼承章節深入。
public 成員;private/protected 不可直接存取。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_name、m_age),優點:
name = name 錯誤)。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」習慣,能構建高內聚、低耦合、易維護的類別。