Если у меня есть класс с членами данных private
, например, могу ли я сказать, что эти члены данных недоступны вне класса или они недоступны вне objects
этого класса?C++ - личные данные пользователей
Спасибо.
Если у меня есть класс с членами данных private
, например, могу ли я сказать, что эти члены данных недоступны вне класса или они недоступны вне objects
этого класса?C++ - личные данные пользователей
Спасибо.
private
означает, что функции-члены класса (и любых вложенных типов) могут обращаться к этим элементам данных, учитывая любой экземпляр класса.
причина для downvote? –
Технически говоря, ничего из вышеперечисленного. Вы говорите: «Только те объекты, которые имеют частный доступ к этому классу, могут обращаться к этим переменным».
Это включает в себя
объекты этого типа
, функции-члены этого типа,
друзей этого типа
, функции-члены друзей этого типа ...
На самом деле, технически говоря, объекты не в состоянии доступа ничего, поскольку у них нет поведения.
Они недоступны вне кода класса (включая производные классы); за исключением заявленных объектов friend
. Поскольку код класса (функции члена класса) привязан к классу (а не к отдельному объекту), доступность оценивается на уровне класса.
class Foo
{
private:
int secret;
Foo * other;
public:
explicit Foo(Foo* other_) : other(other_), secret(42) {}
Foo() : other(0), secret(0) {}
int Peek(void) { return secret; }
int neighborPeek(void)
{
if (other)
return other->secret; // this is OK, we're still inside the class
else
return -1;
}
int main()
{
Foo aFoo, bFoo(&aFoo);
std::cout << bFoo.neighborPeek(); // will dump aFoo's secret.
return 0;
}
Не можете ли они получить доступ через reinterpret_casting и указатели, если я не ошибаюсь? Конечно, это была бы ужасная идея. – Marlon
reinterpret_cast имеет длинное имя по какой-то причине - напомнить вам, что вы не должны его использовать, кроме случаев, когда нет альтернативы! Вы также можете делать трюки с использованием препроцессора или путем издевательства над эквивалентной структурой данных с более расслабленными правилами доступа или ... В C/C++ почти все возможно _possible_, но если у вас есть трюки с играми, то что-то пошло не так на более высоком уровне! (И, конечно же, вы просто сломали инкапсуляцию, и поэтому все ставки отключены для стабильности вашего кода против изменений в реализации восходящего потока.) – andybuckley
Если это частный, то (курсив мой):
его имя может использоваться только членами и друзьями класса, в котором она объявлена.
- Stroustup's «Язык программирования C++» и один из проектов стандартов.
В C++ к самим данным всегда могут быть доступны другие механизмы. Цель состоит в том, чтобы препятствовать случайному доступу, даже если вредоносный доступ по-прежнему возможен.
@LaszloG: Эти ссылки могут заинтересовать вас [gotw] (http://www.gotw.ca/gotw/076.htm)/ [это] (http://bloglitb.blogspot.com/2010_07_01_archive. html) –
? Извините, я как-то ошибся в функции '@' ... –
@Eclipse: Пожалуйста, отмените свой ответ, я буду его защищать (оставьте мне комментарий, чтобы напомнить мне). Дэн является идиотом-downvoter, который никогда не слышал о операторах доступа к члену ('.',' -> ','. * ',' -> * '). –