簡體   English   中英

C++ 類的私有成員和受保護成員有什么區別?

[英]What is the difference between private and protected members of C++ classes?

C++ 類中的private成員和protected成員有什么區別?

我從最佳實踐約定中了解到,在 class 之外未調用的變量和函數應該設為private - 但看看我的 MFC 項目,MFC 似乎更傾向於protected

有什么區別,我應該使用哪個?

私有成員只能在定義它們的類中訪問。

受保護成員可在定義它們的類中以及從該類繼承的類中訪問。

編輯:它們的類的朋友也可以訪問它們,在受保護成員的情況下,它們的派生類的朋友也可以訪問它們。

編輯 2:在您的問題的上下文中使用任何有意義的內容。 您應該盡可能將成員設為私有,以減少耦合並保護基類的實現,但如果不可能,則使用受保護的成員。 查看C++ FAQ以更好地理解該問題。 這個關於受保護變量的問題也可能有所幫助。

A 類的公共成員可供所有人訪問。

類 A 的受保護成員不能在 A 的代碼之外訪問,但可以從從 A 派生的任何類的代碼中訪問。

類 A 的私有成員不能在 A 的代碼之外訪問,也不能從從 A 派生的任何類的代碼中訪問。

因此,最終,在受保護或私有之間進行選擇是在回答以下問題:您願意對派生類的程序員信任多少?

默認情況下,假定派生類不受信任,並將您的成員設為私有 如果你有一個很好的理由讓母類的內部結構可以自由訪問它的派生類,那么你可以讓它們受到保護。

可以從派生類訪問受保護的成員。 私人的不行。

class Base {

private: 
  int MyPrivateInt;
protected: 
  int MyProtectedInt;
public:
  int MyPublicInt;
};

class Derived : Base
{
public:
  int foo1()  { return MyPrivateInt;} // Won't compile!
  int foo2()  { return MyProtectedInt;} // OK  
  int foo3()  { return MyPublicInt;} // OK
};‌‌

class Unrelated 
{
private:
  Base B;
public:
  int foo1()  { return B.MyPrivateInt;} // Won't compile!
  int foo2()  { return B.MyProtectedInt;} // Won't compile
  int foo3()  { return B.MyPublicInt;} // OK
};

在“最佳實踐”方面,這取決於。 如果有人可能想要從您現有的類派生一個新類並需要訪問內部成員的可能性很小,請將它們設為 Protected,而不是 Private。 如果它們是私有的,您的類可能會變得難以輕松繼承。

MFC 之所以偏愛受保護,是因為它是一個框架。 您可能希望對 MFC 類進行子類化,在這種情況下,需要一個受保護的接口來訪問對類的一般使用不可見的方法。

這完全取決於您想要做什么,以及您希望派生類能夠看到什么。

class A
{
private:
    int _privInt = 0;
    int privFunc(){return 0;}
    virtual int privVirtFunc(){return 0;}
protected:
    int _protInt = 0;
    int protFunc(){return 0;}
public:
    int _publInt = 0;
    int publFunc()
    {
         return privVirtFunc();
    }
};

class B : public A
{
private:
    virtual int privVirtFunc(){return 1;}
public:
    void func()
    {
        _privInt = 1; // wont work
        _protInt = 1; // will work
        _publInt = 1; // will work
        privFunc(); // wont work
        privVirtFunc(); // will work, simply calls the derived version.
        protFunc(); // will work
        publFunc(); // will return 1 since it's overridden in this class
    }
}

標記為protected屬性和方法——與私有的不同——在子類中仍然可見。

除非您不想在可能的子類中使用或提供覆蓋該方法的可能性,否則我會將它們設為private

當然看看受保護的成員變量問題。 建議使用 private 作為默認值(就像 C++ class ses 所做的那樣)以減少耦合。 受保護的成員變量總是一個壞主意,受保護的成員函數可用於例如模板方法模式。

受保護的成員只能由類的后代以及同一模塊中的代碼訪問。 私有成員只能由它們聲明的類以及同一模塊中的代碼訪問。

當然,友元函數會將其拋之腦后,但哦,好吧。

私有成員只能從類內部訪問,受保護成員可以在類和派生類中訪問。 這是面向對象語言中繼承的一個特性。

您可以在 C++ 中擁有私有、受保護和公共繼承,這將決定哪些派生類可以在繼承層次結構中訪問。 例如,C# 只有公共繼承。

private = 只能由母艦(基類)訪問(即只有我的父母可以進入我父母的卧室)

protected = 母艦(基類)和她的女兒可以訪問(即只有我的父母可以進入我父母的卧室,但允許兒子/女兒進入父母的卧室)

public = 母艦(基類)、女兒和其他所有人都可以訪問(即只有我的父母可以進入我父母的卧室,但這是一個家庭聚會 - mi casa su casa)

由於在派生類中不需要公共成員函數來獲取和更新受保護的成員,這提高了代碼的效率並減少了我們需要編寫的代碼量。 但是,派生類的程序員應該知道他在做什么。

成員數據首選private C++ 類中的成員默認是private的。

public是成員函數的首選,盡管這是一個意見問題。 至少某些方法必須是可訪問的。 public對所有人開放。 這是最靈活的選擇,也是最不安全的。 任何人都可以使用它們,任何人都可以濫用它們。

private根本無法訪問。 沒有人可以在課堂外使用它們,也沒有人可以濫用它們。 甚至在派生類中也不行。

protected是一種折衷方案,因為它可以在派生類中使用。 當你從一個類派生時,你對基類有很好的理解,注意不要誤用這些成員。

MFC 是 Windows API 的 C++ 包裝器,它更喜歡publicprotected Visual Studio 向導生成的類包含protectedpublicprivate成員的丑陋組合。 但是 MFC 類本身有一些邏輯。

SetWindowText等成員是public因為您經常需要訪問這些成員。

OnLButtonDown等成員處理窗口收到的通知。 它們不應被訪問,因此它們受到protected 您仍然可以在派生類中訪問它們以覆蓋這些函數。

一些成員必須做線程和消息循環,它們不應該被訪問或覆蓋,所以它們被聲明為private

在 C++ 結構中,成員默認是public的。 結構通常僅用於數據,而不是方法,因此public聲明被認為是安全的。

Private :可通過類成員函數和友元函數或友元類訪問。 對於 C++ 類,這是默認訪問說明符。

受保護:可由類成員函數、友元函數或友元類和派生類訪問。

  • 您可以根據需要將類成員變量或函數(甚至 typedef 或內部類)保持為私有或受保護。
  • 大多數情況下,您將類成員保留為私有並添加 get/set 函數進行封裝。 這有助於維護代碼。
  • 當您希望保持公共函數模塊化或消除重復代碼而不是將整個代碼寫入單個函數時,通常使用私有函數。 這有助於維護代碼。

有關更多詳細信息,請參閱此鏈接

  • Private :它是一個訪問說明符。 默認情況下,c++/java 中的實例(成員)變量或類的方法是私有的。 在繼承期間,代碼和數據總是被繼承,但不能在類外訪問。 我們可以將我們的數據成員聲明為私有的,這樣就沒有人可以直接更改我們的成員變量,並且我們可以提供公共的 getter 和 setter 來更改我們的私有成員。 而這個概念總是應用在業務規則中。

  • Protected :它也是一個訪問說明符。 在 C++ 中,受保護的成員可以在類內和繼承的類中訪問,但不能在類外訪問。 在 Java 中,受保護的成員可以在類內、繼承的類以及同一包中的所有類中訪問。

私有成員只能在它聲明的同一類中訪問,而受保護成員可以在聲明它的類中訪問,以及由它繼承的類。

受保護的非靜態基類成員可以由從該基類派生的任何類的成員和朋友使用以下方法之一訪問:

  • 指向直接或間接派生類的指針
  • 對直接或間接派生類的引用
  • 直接或間接派生類的對象

protected關鍵字指定對成員列表中 class 成員的訪問,直到下一個訪問說明符( publicprivate )或 class 定義的末尾。 聲明為protectedClass members只能由以下人員使用:

  • 最初聲明這些成員的 class 的成員函數。
  • 最初聲明這些成員的 class 的朋友。
  • 從最初聲明這些成員的 class 派生的具有公共或受保護訪問權限的類。
  • 直接私有派生類,它們也對受保護成員具有私有訪問權限。

在基礎 class 的名稱之前, protected關鍵字指定基礎 class 的公共和受保護成員是其派生類的受保護成員。

受保護的成員不像private成員那樣私有,私有成員只能被聲明它們的 class 的成員訪問,但它們不像公共成員那樣公開,在任何 function 中都可以訪問。

任何friend或派生 class 的成員 function 都可以訪問也聲明為static的受保護成員。 Protected members that are not declared as static are accessible to friends and member functions in a derived class only through a pointer to, reference to, or object of the derived class.

受保護的 (C++)

C++ 類中的私有成員和受保護成員有什么區別?

其他答案已經說明:

  • 公共 - 所有人都可以訪問。
  • protected - 派生類(和朋友)可以訪問。
  • 私人 - 受限。

有什么區別,我應該使用哪個?

C++ 核心指南建議數據應該始終是私有的。 我認為這是一個很好的建議,因為當您擁有可以訪問受保護數據的派生類時,它會產生“數據意大利面條”。 保護功能更有意義,但這取決於用例。

對於功能,您可以選擇。 對於數據,您應該將其設為私有並在需要時提供受保護的訪問器函數。 這可以更好地控制 class 數據。

private 和 protected 訪問修飾符是一回事,只有基類的受保護成員可以在子(派生)類中的基類范圍之外訪問。 它也同樣適用於繼承。 但是使用 private 修飾符,基類的成員只能在基類的范圍或代碼中訪問,並且只能在其友元函數中訪問''''

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM