public, private, protected 訪問許可權

小马同学..3發表於2024-07-07

在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,從而實現資料的訪問和顯示。這展示了封裝和訪問控制的有效應用。

相關文章