在C++中,封裝(Encapsulation)是物件導向程式設計的一個基本概念。它透過將資料和方法封裝在類中來隱藏內部實現細節,並透過訪問控制來保護資料的完整性和安全性。C++提供了三種訪問控制許可權:public、private 和 protected。下面詳細介紹這三種訪問許可權及其用法。
public 訪問許可權
public 成員可以被任何地方訪問,不受訪問限制。它們通常用於介面部分,即希望在類外部訪問的方法和資料成員。
示例程式碼:
#include <iostream>
class MyClass {
public:
int publicVar;
void publicMethod() {
std::cout << "Public method called. PublicVar = " << publicVar << std::endl;
}
};
int main() {
MyClass obj;
obj.publicVar = 42; // 可以直接訪問 public 成員
obj.publicMethod(); // 可以直接呼叫 public 方法
return 0;
}
private 訪問許可權
private 成員只能在類的內部訪問,類的外部無法直接訪問。它們通常用於隱藏類的內部實現細節,只能透過類的公有介面進行訪問。
示例程式碼:
#include <iostream>
class MyClass {
private:
int privateVar;
void privateMethod() {
std::cout << "Private method called. PrivateVar = " << privateVar << std::endl;
}
public:
void setPrivateVar(int val) {
privateVar = val;
}
void showPrivateVar() {
privateMethod();
}
};
int main() {
MyClass obj;
// obj.privateVar = 42; // 錯誤:不能直接訪問 private 成員
// obj.privateMethod(); // 錯誤:不能直接呼叫 private 方法
obj.setPrivateVar(42); // 透過 public 方法間接訪問 private 成員
obj.showPrivateVar(); // 透過 public 方法間接呼叫 private 方法
return 0;
}
protected 訪問許可權
protected 成員可以在類的內部和派生類中訪問,但不能在類的外部訪問。它們通常用於基類和派生類之間的共享實現細節。
示例程式碼:
#include <iostream>
class Base {
protected:
int protectedVar;
void protectedMethod() {
std::cout << "Protected method called. ProtectedVar = " << protectedVar << std::endl;
}
};
class Derived : public Base {
public:
void accessProtectedMember() {
protectedVar = 42; // 可以在派生類中訪問 protected 成員
protectedMethod(); // 可以在派生類中呼叫 protected 方法
}
};
int main() {
Derived obj;
// obj.protectedVar = 42; // 錯誤:不能在類的外部訪問 protected 成員
// obj.protectedMethod(); // 錯誤:不能在類的外部呼叫 protected 方法
obj.accessProtectedMember(); // 透過派生類的方法訪問 protected 成員
return 0;
}
訪問控制總結
public:公共訪問許可權,任何地方都可以訪問。
private:私有訪問許可權,只能在類的內部訪問,外部無法直接訪問。
protected:保護訪問許可權,可以在類的內部和派生類中訪問,外部無法直接訪問。
訪問控制的應用
透過訪問控制,可以有效地實現資料封裝,隱藏內部實現細節,保護資料的完整性和安全性。同時,訪問控制也支援物件導向程式設計中的繼承和多型機制。以下是一個綜合示例,展示瞭如何在實際應用中使用訪問控制:
#include <iostream>
#include <string>
class Person {
private:
std::string name;
int age;
protected:
std::string getName() const {
return name;
}
int getAge() const {
return age;
}
public:
Person(const std::string& n, int a) : name(n), age(a) {}
void display() const {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
};
class Student : public Person {
private:
int studentID;
public:
Student(const std::string& n, int a, int id) : Person(n, a), studentID(id) {}
void showDetails() const {
// 可以訪問基類的 protected 成員函式
std::cout << "Student Name: " << getName() << ", Age: " << getAge() << ", ID: " << studentID << std::endl;
}
};
int main() {
Person person("Alice", 30);
person.display();
Student student("Bob", 20, 12345);
student.showDetails();
return 0;
}
在這個示例中,Person 類的成員 name 和 age 是私有的,不能直接在類外部訪問。Student 類繼承了 Person 類,可以訪問其受保護的成員函式 getName 和 getAge,從而實現資料的訪問和顯示。這展示了封裝和訪問控制的有效應用。