Частные и защищенные участники: С++
Может ли кто-нибудь просветить меня относительно разницы между private
и protected
членами в классах?
Я понимаю, от условностей наилучшей практики, что переменные и функции, которые не называются вне класса должны быть сделаны private
- но глядя на мой MFC проект, MFC, кажется, выступают за protected
.
Какая разница и какую мне использовать?
Ответы
Ответ 1
Частные члены доступны только в пределах класса, определяющего их.
Защищенные члены доступны в классе, который определяет их и в классах, которые наследуются от этого класса.
Изменить: оба доступны также друзьям своего класса, а в случае защищенных членов - друзьями их производных классов.
Изменить 2: использовать все, что имеет смысл в контексте вашей проблемы. Вы должны попытаться сделать членов частным, когда можете, уменьшить связь и защитить реализацию базового класса, но если это невозможно, используйте защищенные члены. Проверьте часто задаваемые вопросы по С++ для лучшего понимания проблемы. Этот вопрос об защищенных переменных также может помочь.
Ответ 2
Публичные члены класса A доступны для всех и для всех.
Защищенные члены класса A недоступны вне кода A, но доступны из кода любого класса, производного от A.
Частные члены класса A недоступны вне кода A или из кода любого класса, производного от A.
Итак, в конечном итоге выбор между защищенным или приватным отвечает на следующие вопросы: Сколько доверия вы хотите поместить в программиста производного класса?
По умолчанию, предположим, что производному классу не нужно доверять, а сделать ваши члены закрытыми. Если у вас есть веские основания для бесплатного доступа к внутренним элементам материнского класса к его производным классам, вы можете защитить их.
Ответ 3
Защищенные члены могут быть доступны из производных классов. Частные не могут.
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
};
С точки зрения "лучшей практики", это зависит. Если есть даже слабая вероятность того, что кто-то захочет получить новый класс из вашего существующего и ему нужен доступ к внутренним членам, сделайте их Защищенными, а не Приватными. Если они частные, ваш класс может стать трудным для наследования.
Ответ 4
Причина, по которой защита MFC защищена, заключается в том, что она является основой. Вероятно, вы хотите подклассифицировать классы MFC, и в этом случае необходим защищенный интерфейс для доступа к методам, которые не видны для общего использования класса.
Ответ 5
Все зависит от того, что вы хотите сделать, и того, что вы хотите, чтобы производные классы могли видеть.
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 overridden in this class
}
}
Ответ 6
Атрибуты и методы, помеченные как protected
, - в отличие от частных - все еще видны в подклассах.
Если вы не хотите использовать или предоставить возможность переопределить метод в возможных подклассах, я бы сделал их private
.
Ответ 7
Обязательно рассмотрите вопрос Защищенные Member Variables. Рекомендуется использовать private по умолчанию (как и С++ class
ses do) для уменьшения связи. Защищенные переменные-члены чаще всего являются плохой идеей, защищенные функции-члены могут использоваться, например. шаблон шаблона.
Ответ 8
Защищенные члены могут быть доступны только потомкам класса и кодом в том же модуле. Частным членам доступен только класс, в котором они объявлены, и кодом в том же модуле.
Конечно, функции друзей выкидывают это из окна, но хорошо.
Ответ 9
частные члены доступны только из класса, защищенные члены доступны в классе и производных классах. Это свойство наследования в языках OO.
В С++ вы можете иметь частное, защищенное и публичное наследование, которое будет определять, какие производные классы могут получить доступ в иерархии наследования. С#, например, имеет только публичное наследование.
Ответ 10
закрытый= доступен только материнскому (базовому классу)
(т.е. только мой родитель может войти в родительскую спальню)
защищенный= доступный по материнской линии (базовый класс) и ее дочери
(т.е. только мой родитель может войти в родительскую спальню, но дал разрешение сына/дочери войти в родительскую спальню)
общедоступный= доступный материнством (базовый класс), дочерью и всеми остальными
(т.е. только мой родитель может войти в родительскую спальню, но это вечеринка дома - mi casa su casa)
Ответ 11
Поскольку для извлечения и обновления защищенных членов в производном классе не требуется никакой общедоступной функции-члена, это повышает эффективность кода и уменьшает объем кода, который нам нужно написать. Тем не менее, программист из производного класса должен знать, что он делает.
Ответ 12
Доступ к частному члену возможен только в том же классе, где он объявляет, где в качестве защищенного члена можно получить доступ в классе, где он объявлен вместе с классами, которые наследуются им.
Ответ 13
-
Частный: это спецификатор доступа. По умолчанию переменные экземпляра (члена) или методы класса в c++/java являются закрытыми. Во время наследования код и данные всегда наследуются, но не доступны вне класса. Мы можем объявить наши члены-данные частными, чтобы никто не мог вносить прямые изменения в наши переменные-члены, и мы можем предоставить общедоступные методы получения и установки для изменения наших частных членов. И эта концепция всегда применяется в бизнес-правилах.
-
Защищено: это также спецификатор доступа. В c++ защищенные члены доступны внутри класса и унаследованному классу, но не за его пределами. В Java защищенные члены доступны внутри класса, унаследованному классу, а также всем классам в одном пакете.
Ответ 14
Для данных участника предпочтительнее private
. Члены в классах C++ по умолчанию являются private
.
public
предпочтительнее для членских функций, хотя это вопрос мнения. По крайней мере, некоторые методы должны быть доступны. public
доступна для всех. Это наиболее гибкий и наименее безопасный вариант. Любой может использовать их, и любой может злоупотреблять ими.
private
не доступен вообще. Никто не может использовать их вне класса, и никто не может злоупотреблять ими. Даже в производных классах.
protected
- это компромисс, потому что он может использоваться в производных классах. Когда вы выходите из класса, вы хорошо понимаете базовый класс и стараетесь не злоупотреблять этими членами.
MFC - это оболочка C++ для Windows API, она предпочитает public
и protected
. Классы, сгенерированные мастером Visual Studio, имеют ужасное сочетание protected
, public
и private
членов. Но есть некоторая логика для самих классов MFC.
Такие члены, как SetWindowText
являются public
поскольку вам часто требуется доступ к этим элементам.
Члены, такие как OnLButtonDown
, обрабатывают уведомления, полученные окном. Они не должны быть доступны, поэтому они protected
. Вы по-прежнему можете обращаться к ним в производном классе, чтобы переопределить эти функции.
Некоторые члены должны делать потоки и циклы сообщений, к ним нельзя обращаться или переопределять, поэтому они объявлены как private
В структурах C++ члены являются public
по умолчанию. Структуры обычно используются только для данных, а не для методов, поэтому public
объявление считается безопасным.
Ответ 15
Защищенный член нестатического базового класса может получить доступ к членам и друзьям любых классов, полученных из этого базового класса, используя одно из следующих действий:
- Указатель на прямо или косвенно полученный класс
- Ссылка на прямой или косвенно производный класс
- Объект прямого или косвенного производного класса
Ответ 16
Личное: Доступно по функциям членов класса & функция друга или класс друга.
Для класса C++ это спецификатор доступа по умолчанию.
Защищено: Доступно для функций-членов класса, функции друга или класса друга & производные классы.
- Вы можете хранить переменную или функцию члена класса (даже typedefs или внутренние классы) как частные или защищенные в соответствии с вашими требованиями.
- Большую часть времени вы сохраняете член класса как приватный и добавляете функции get/set для инкапсуляции. Это помогает в обслуживании кода.
- Обычно закрытая функция используется, когда вы хотите сохранить свои открытые функции модульными или исключить повторение кода вместо записи всего кода в одну функцию. Это помогает в обслуживании кода.
Обратитесь по этой ссылке для более подробной информации.
Ответ 17
частные и защищенные модификаторы доступа являются одними и теми же, только защищенные члены базового класса могут быть доступны за пределами основного класса в дочернем (производном) классе.
Это также относится к наследованию.
Но с помощью частного модификатора члены базового класса могут быть доступны только в области или коде базового класса, а его функции-друзья - только '' '' '