在 C++ 中使用私有類成員與保護類成員

Jinku Hu 2023年1月30日 2021年1月4日
  1. 在 C++ 中使用 private 屬性來表示類的使用者無法訪問的類成員
  2. 使用 protected 屬性來表示派生類或友類的成員函式可以訪問的類成員
在 C++ 中使用私有類成員與保護類成員

本文將演示關於如何在 C++ 中正確使用 privateprotected 類成員的多種方法。

在 C++ 中使用 private 屬性來表示類的使用者無法訪問的類成員

private 關鍵字是 C++ 語言實現封裝功能的基本部分之一。封裝的主要目標是為類的使用者建立一個強制的介面,並限制只對特定成員的直接訪問。需要注意的是,定義類的介面意味著類的使用者不需要直接修改或訪問資料成員,而是呼叫公共方法,這些方法是為了對給定物件進行這些操作。

訪問控制一般有三個關鍵詞:publicprivateprotected。在 public 屬性之後定義的成員對該類的所有使用者都可以訪問。另一方面,private 指定符定義了只有類的成員函式才能訪問的成員。在下面的例子中,來自 main 函式的程式碼可以宣告一個型別為 CustomString 的變數,但要訪問它的成員 str,程式碼需要呼叫定義為 public 屬性的 getString 方法。

#include <iostream>
#include <string>
#include <utility>
#include <vector>

using std::cout; using std::endl;
using std::vector; using std::string;

class CustomString {
public:
    CustomString() = default;
    explicit CustomString(const string &s):
            str(s) { num = s.size(); }

    virtual ~CustomString() = default;

    string& getString() { return str; };
private:
    string str;
protected:
    int num{};
};

int main()
{
    CustomString str1("Hello There 1");

    cout << "str1: " << str1.getString() << endl;

    exit(EXIT_SUCCESS);
}

輸出:

str1: Hello There 1

使用 protected 屬性來表示派生類或友類的成員函式可以訪問的類成員

另一個可用於訪問控制的關鍵字是 protected 屬性,它使得類成員函式、派生類成員、甚至友類都可以訪問之後宣告的成員。注意,後面的兩個不能直接從基類物件訪問 protected 成員,而是從派生類物件訪問。下一個例子演示了從 CustomString 派生出來的 CustomSentence 類,但後一個類的 num 成員是一個保護成員。因此,不能從 CustomString 物件中訪問它。也就是說,getSize 函式不屬於 CustomString 類,只有 CustomSentence 物件可以通過呼叫該方法來檢索 num 值。

#include <iostream>
#include <string>
#include <utility>
#include <vector>

using std::cout; using std::endl;
using std::vector; using std::string;

class CustomString {
public:
    CustomString() = default;
    explicit CustomString(const string &s):
            str(s) { num = s.size(); }

    virtual ~CustomString() = default;

    string& getString() { return str; };
private:
    string str;
protected:
    int num{};
};

class CustomSentence : public CustomString {
public:
    CustomSentence() = default;
    explicit CustomSentence(const string &s):
            sent(s) { num = s.size(); }
    ~CustomSentence() override = default;

    int getSize() const { return num; };
    string& getSentence() { return sent; };
private:
    string sent;
};

int main()
{
    CustomString str1("Hello There 1");
    CustomSentence sent1("Hello There 2");

    cout << "str1: " << str1.getString() << endl;
    cout << "sent1: " << sent1.getSentence() << endl;
    cout << "size: " << sent1.getSize() << endl;

    exit(EXIT_SUCCESS);
}

輸出:

str1: Hello There 1
sent1: Hello There 2
size: 13
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Class