Jaka jest różnica między prywatnymi a chronionymi członkami klas C++?
Jaka jest różnica pomiędzy private
i protected
w klasach C++?
Z najlepszych praktyk rozumiem, że zmienne i funkcje, które nie są wywoływane poza klasą, powinny być tworzone private
- ale patrząc na mój projekt MFC, MFC wydaje się faworyzować protected
.
Jaka jest różnica i którego powinienem użyć?
17 answers
Private members są dostępne tylko w obrębie definiującej je klasy.
Protected members są dostępne w klasie, która je definiuje oraz w klasach, które dziedziczą z tej klasy.
Edit: oba są również dostępne dla przyjaciół z ich klasy, a w przypadku chronionych członków-dla przyjaciół z ich klas pochodnych.
Edit 2: używaj tego, co ma sens w kontekście Twojego problemu. Powinieneś starać się, aby członkowie byli prywatni, kiedy tylko możesz, aby zmniejszyć sprzężenie i Chroń implementację klasy bazowej, ale jeśli nie jest to możliwe, użyj protected members. Sprawdź C++ FAQ , aby lepiej zrozumieć problem. to pytanie o chronione zmienne może również pomóc.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-30 15:46:30
Public Członkowie klasy A są dostępni dla wszystkich i dla wszystkich.
Protected Członkowie klasy a nie są dostępni poza kodem A, ale są dostępni z kodu dowolnej klasy wywodzącej się z A.
Klasy A nie są dostępne poza kodem A, ani z kodu żadnej klasy wywodzącej się z A.
Tak więc, w końcu, wybór pomiędzy chronionym a prywatnym jest odpowiedzią na następujące pytania: Ile jest zaufania jesteś gotów umieścić w programistę klasy pochodnej?
Domyślnie , Załóżmy, że klasa pochodna nie ma być zaufana i uczyń członków prywatnymi. Jeśli masz bardzo dobry powód, aby dać darmowy dostęp do wewnętrznych klas macierzystych do klas pochodnych, możesz je zabezpieczyć.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 09:22:10
Protected members mogą być dostępne z klas pochodnych. Prywatne nie mogą.
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
};
Jeśli chodzi o "najlepsze praktyki", to zależy. Jeśli istnieje choćby niewielka możliwość, że ktoś może chcieć wyprowadzić nową klasę z Twojej istniejącej i potrzebować dostępu do wewnętrznych członków, uczyń je chronionymi, a nie prywatnymi. Jeśli są prywatne, twoja klasa może stać się trudna do odziedziczenia z łatwością.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-04 11:53:17
Powodem, dla którego MFC faworyzuje protected, jest to, że jest to framework. Prawdopodobnie chcesz podklasować klasy MFC i w takim przypadku potrzebny jest chroniony interfejs, aby uzyskać dostęp do metod, które nie są widoczne dla ogólnego użytku klasy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 09:19:01
Wszystko zależy od tego, co chcesz zrobić i co chcesz, aby klasy pochodne były w stanie zobaczyć.
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(); // wont work
protFunc(); // will work
publFunc(); // will return 1 since it's overridden in this class
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 09:26:52
Atrybuty i metody oznaczone jako protected
są-w przeciwieństwie do prywatnych-nadal widoczne w podklasach.
Jeśli nie chcesz użyć lub zapewnić możliwości nadpisania metody w możliwych podklasach, zrobię je private
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 09:14:53
Oczywiście spójrz na pytanie chronione zmienne Członkowskie . Zalecane jest użycie domyślnego private (podobnie jak C++ class
ses do)w celu zmniejszenia sprzężenia. Chronione zmienne członkowskie są najczęściej złym pomysłem, chronione funkcje Członkowskie mogą być używane np. do wzorca metody szablonu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:32
Protected members mogą być dostępne tylko przez potomków klasy i przez KOD w tym samym module. Do członków prywatnych można uzyskać dostęp tylko za pomocą klasy, w której są zadeklarowane, oraz za pomocą kodu w tym samym module.
Oczywiście funkcje przyjaciół wyrzuć to przez okno, ale cóż.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 09:15:35
Private members są dostępne tylko z poziomu klasy, protected members są dostępne w klasie i klasach pochodnych. Jest to cecha dziedziczenia w językach OO.
Możesz mieć prywatne, chronione i publiczne dziedziczenie w C++, które określi, do jakich klas pochodnych można uzyskać dostęp w hierarchii dziedziczenia. Na przykład C# ma tylko publiczne dziedziczenie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 09:26:32
Private = dostępne tylko dla statku macierzystego (klasy bazowej) (tzn. tylko mój rodzic może wejść do sypialni mojego rodzica)
Protected = dostępne dla statku matki (klasy bazowej) i jej córek (tj. tylko mój rodzic może wejść do sypialni mojego rodzica, ale dał synowi / córce pozwolenie na wejście do sypialni rodzica)
Public = dostępne dla statku matki (klasy bazowej), córki i wszystkich innych (czyli tylko mój rodzic może wejść do sypialni mojego rodzica, ale jest to dom party-mi casa su casa)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-01 16:02:20
Ponieważ żadna publiczna funkcja członka nie jest potrzebna do pobierania i aktualizowania chronionych członków w klasie pochodnej, Zwiększa to wydajność kodu i zmniejsza ilość kodu, który musimy napisać. Jednak programista klasy pochodnej powinien być świadomy tego, co robi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-27 14:04:32
private
jest preferowany dla danych członkowskich. Członkowie klas C++ są domyślnie private
.
public
jest preferowany do pełnienia funkcji Członkowskich, choć jest to kwestia opinii. Przynajmniej niektóre metody muszą być dostępne. public
jest dostępna dla wszystkich. Jest to najbardziej elastyczna opcja i najmniej bezpieczna. Każdy może z nich korzystać i każdy może je nadużywać.
private
nie jest dostępny w ogóle. Nikt nie może ich używać poza klasą i nikt nie może ich nadużywać. Nawet w pochodnej klasy.
protected
jest kompromisem, ponieważ może być używany w klasach pochodnych. Kiedy wywodzisz się z klasy, masz dobre zrozumienie klasy bazowej i jesteś ostrożny, aby nie nadużywać tych członków.
MFC jest opakowaniem C++ Dla Windows API, preferuje public
i protected
. Klasy generowane przez Visual Studio wizard mają brzydką mieszankę protected
, public
, i private
członków. Ale jest trochę logiki do samych klas MFC.
Członkowie tacy jak SetWindowText
są public
, Ponieważ ty często trzeba uzyskać dostęp do tych członków.
Członkowie, tacy jak OnLButtonDown
, zajmują się powiadomieniami otrzymywanymi przez okno. Nie powinny być dostępne, dlatego są protected
. Nadal można uzyskać do nich dostęp w klasie pochodnej, aby nadpisać te funkcje.
Niektórzy członkowie muszą wykonywać wątki i pętle wiadomości, nie powinny być dostępne ani nadpisywane, więc są zadeklarowane jako private
W strukturach C++ członkowie są domyślnie public
. Struktury są zwykle używane tylko do danych, a nie metody, dlatego deklaracja public
jest uważana za bezpieczną.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-08 15:28:53
Private: dostępne przez funkcje członka klasy & friend function lub friend class. Dla klasy C++ jest to domyślne określenie dostępu.
Protected: Accessible by class member functions, friend function lub friend class & derived classes.
- możesz zachować zmienną lub funkcję członka klasy (nawet typedefs lub klasy wewnętrzne) jako prywatną lub chronioną zgodnie z wymaganiami.
- przez większość czasu zachowujesz członka klasy jako prywatnego i dodajesz get / set funkcje do hermetyzacji. Pomaga to w utrzymaniu kodu.
- ogólnie funkcja prywatna jest używana, gdy chcesz zachować modułowość funkcji publicznych lub wyeliminować powtarzający się kod zamiast zapisywać cały kod do pojedynczej funkcji. Pomaga to w utrzymaniu kodu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-25 11:45:56
Private: jest to specyfik dostępu. Domyślnie zmienne instancji (member) lub metody klasy w c++ / java są prywatne. Podczas dziedziczenia kod i dane są zawsze dziedziczone, ale nie są dostępne poza klasą. Możemy zadeklarować naszych członków danych jako prywatnych, aby nikt nie mógł wprowadzać bezpośrednich zmian do naszych zmiennych członkowskich i możemy zapewnić publiczne gettery i settery w celu zmiany naszych prywatnych członków. I ta koncepcja jest zawsze stosowana w zasada biznesu.
Protected: jest to również Specyfikacja dostępu. W C++, protected members są dostępne wewnątrz klasy i do dziedziczonej klasy, ale nie poza klasą. W Javie protected members są dostępne w ramach klasy, dziedziczonej klasy, jak również dla wszystkich klas w ramach tego samego pakietu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-27 12:50:22
Private member moĹźe byÄ ‡ dostÄ ™ pny tylko w tej samej klasie, gdzie zadeklarowaĺ', gdzie jako protected member moĹźe byÄ ‡ dostÄ ™ pny w klasie, gdzie jest zadeklarowany wraz z klasami, ktĂłre sÄ ... przez niego dziedziczone .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-14 14:38:29
Chroniony niestatyczny element klasy bazowej może być dostępny dla członków i przyjaciół dowolnych klas wywodzących się z tej klasy bazowej za pomocą jednej z następujących metod:
- wskaźnik do bezpośrednio lub pośrednio pochodnej klasy
- odniesienie do klasy bezpośrednio lub pośrednio pochodnej
- obiekt klasy bezpośrednio lub pośrednio pochodnej
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-21 14:01:36
Modyfikatory dostępu prywatnego i chronionego są tymi samymi tylko, że chronione elementy klasy bazowej mogą być dostępne poza zakresem klasy bazowej w klasie potomnej (pochodnej). To samo dotyczy również dziedziczenia . Ale z modyfikatorem prywatnym Członkowie klasy bazowej mogą być dostępne tylko w zakresie lub kodzie klasy bazowej i jej funkcji przyjacielskich tylko ""
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-05 08:45:46