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

Jinku Hu 2023年10月12日
  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::string;
using std::vector;

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::string;
using std::vector;

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
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Class