在 C++ 中使用私有類成員與保護類成員
本文將演示關於如何在 C++ 中正確使用 private
與 protected
類成員的多種方法。
在 C++ 中使用 private
屬性來表示類的使用者無法訪問的類成員
private
關鍵字是 C++ 語言實現封裝功能的基本部分之一。封裝的主要目標是為類的使用者建立一個強制的介面,並限制只對特定成員的直接訪問。需要注意的是,定義類的介面意味著類的使用者不需要直接修改或訪問資料成員,而是呼叫公共方法,這些方法是為了對給定物件進行這些操作。
訪問控制一般有三個關鍵詞:public
、private
和 protected
。在 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
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