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

Jinku Hu 2023年1月30日 2021年4月29日
  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::vector; using std::string;

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

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
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