在 C++ 中訪問類的私有成員

Jinku Hu 2023年10月12日
  1. 在 C++ 中使用 private 訪問指定器來封裝類成員
  2. 在 C++ 中使用 public 函式來檢索類的私有成員
在 C++ 中訪問類的私有成員

本文將解釋幾種如何使用 C++ 訪問類的私有成員的方法。

在 C++ 中使用 private 訪問指定器來封裝類成員

訪問說明符用於實現物件導向程式設計的核心特徵-稱為封裝。結果,我們限制了對類的特定資料成員的直接訪問,並從本質上構造了一個對類資料進行操作的介面。C++ 提供了幾個訪問說明符關鍵字,例如:publicprivateprotected,它們通常在需要使用相應可訪問性進行限定的類成員之前。

private 說明符之後定義的成員只能由成員函式訪問,並且不能直接從使用該類的程式碼中引用。通常,構造類時要考慮兩個方面-類的設計者和類的使用者。後者通常是受封裝影響的那個。如果程式設計師在第一個訪問說明符之前定義成員,則在使用 class 關鍵字時預設將其可訪問性設定為 private,在 struct 關鍵字上將其訪問許可權設定為 public

在下面的示例中,我們實現了一個名為 BaseClass 的類,其中有兩個宣告為私有的字串資料成員,因此要訪問這些成員的值,該類的設計者應包括 public 函式來檢索它們。注意,我們可以從下面的程式碼中刪除 public 關鍵字,並且仍然具有 getUsernamegetName 函式作為 public 成員。

封裝的另一個好處是可以靈活地修改內部類的結構,而不必擔心使用者端的相容性問題。只要介面(因此公共功能)不變,該類的使用者就無需修改其程式碼。

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

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

class BaseClass {
 public:
  BaseClass() = default;
  explicit BaseClass(string user, string nm)
      : username(std::move(user)), name(std::move(nm)) {}

  ~BaseClass() = default;

  string& getUsername() { return username; };
  string& getName() { return name; };

 private:
  string username;
  string name;
};

int main() {
  BaseClass base("buddy", "Buddy Bean");

  cout << "base -> name: " << base.getName() << endl;
  cout << "base -> username: " << base.getUsername() << endl;

  exit(EXIT_SUCCESS);
}

輸出:

base -> name: Buddy Bean
base -> username: buddy

在 C++ 中使用 public 函式來檢索類的私有成員

可以使用類介面函式來修改 private 成員,例如,changeUsername 函式從類的使用者那裡獲取 string 引數,並將其值儲存到 private 成員-username 中。注意,還有一個 friend 關鍵字,用於區分允許訪問該類的 private 成員的其他類和函式。這些函式可以是外部函式,而不是上述類的一部分。請注意,錯誤使用訪問說明符很可能導致編譯器錯誤。

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

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

class BaseClass {
 public:
  BaseClass() = default;
  explicit BaseClass(string user, string nm)
      : username(std::move(user)), name(std::move(nm)) {}

  ~BaseClass() = default;

  void changeUsername(const string& s) { username.assign(s); };

  string& getUsername() { return username; };
  string& getName() { return name; };

 private:
  string username;
  string name;
};

int main() {
  BaseClass base("buddy", "Buddy Bean");

  cout << "base -> name: " << base.getName() << endl;
  cout << "base -> username: " << base.getUsername() << endl;
  base.changeUsername("jolly");
  cout << "base -> username: " << base.getUsername() << endl;

  exit(EXIT_SUCCESS);
}

輸出:

base -> name: Buddy Bean
base -> username: buddy
base -> username: jolly
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

LinkedIn Facebook

相關文章 - C++ Class