在 C++ 中訪問類的私有成員
本文將解釋幾種如何使用 C++ 訪問類的私有成員的方法。
在 C++ 中使用 private
訪問指定器來封裝類成員
訪問說明符用於實現物件導向程式設計的核心特徵-稱為封裝。結果,我們限制了對類的特定資料成員的直接訪問,並從本質上構造了一個對類資料進行操作的介面。C++ 提供了幾個訪問說明符關鍵字,例如:public
、private
和 protected
,它們通常在需要使用相應可訪問性進行限定的類成員之前。
在 private
說明符之後定義的成員只能由成員函式訪問,並且不能直接從使用該類的程式碼中引用。通常,構造類時要考慮兩個方面-類的設計者和類的使用者。後者通常是受封裝影響的那個。如果程式設計師在第一個訪問說明符之前定義成員,則在使用 class
關鍵字時預設將其可訪問性設定為 private
,在 struct
關鍵字上將其訪問許可權設定為 public
。
在下面的示例中,我們實現了一個名為 BaseClass
的類,其中有兩個宣告為私有的字串資料成員,因此要訪問這些成員的值,該類的設計者應包括 public
函式來檢索它們。注意,我們可以從下面的程式碼中刪除 public
關鍵字,並且仍然具有 getUsername
和 getName
函式作為 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