2011-01-31 6 views
0

Если у меня есть класс с членами данных private, например, могу ли я сказать, что эти члены данных недоступны вне класса или они недоступны вне objects этого класса?C++ - личные данные пользователей

Спасибо.

+0

@LaszloG: Эти ссылки могут заинтересовать вас [gotw] (http://www.gotw.ca/gotw/076.htm)/ [это] (http://bloglitb.blogspot.com/2010_07_01_archive. html) –

+0

? Извините, я как-то ошибся в функции '@' ... –

+0

@Eclipse: Пожалуйста, отмените свой ответ, я буду его защищать (оставьте мне комментарий, чтобы напомнить мне). Дэн является идиотом-downvoter, который никогда не слышал о операторах доступа к члену ('.',' -> ','. * ',' -> * '). –

ответ

2

private означает, что функции-члены класса (и любых вложенных типов) могут обращаться к этим элементам данных, учитывая любой экземпляр класса.

+1

причина для downvote? –

3

Технически говоря, ничего из вышеперечисленного. Вы говорите: «Только те объекты, которые имеют частный доступ к этому классу, могут обращаться к этим переменным».

Это включает в себя объекты этого типа , функции-члены этого типа, друзей этого типа , функции-члены друзей этого типа ...

На самом деле, технически говоря, объекты не в состоянии доступа ничего, поскольку у них нет поведения.

0

Они недоступны вне кода класса (включая производные классы); за исключением заявленных объектов 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; 
} 
+0

Не можете ли они получить доступ через reinterpret_casting и указатели, если я не ошибаюсь? Конечно, это была бы ужасная идея. – Marlon

+0

reinterpret_cast имеет длинное имя по какой-то причине - напомнить вам, что вы не должны его использовать, кроме случаев, когда нет альтернативы! Вы также можете делать трюки с использованием препроцессора или путем издевательства над эквивалентной структурой данных с более расслабленными правилами доступа или ... В C/C++ почти все возможно _possible_, но если у вас есть трюки с играми, то что-то пошло не так на более высоком уровне! (И, конечно же, вы просто сломали инкапсуляцию, и поэтому все ставки отключены для стабильности вашего кода против изменений в реализации восходящего потока.) – andybuckley

1

Если это частный, то (курсив мой):

его имя может использоваться только членами и друзьями класса, в котором она объявлена.

- Stroustup's «Язык программирования C++» и один из проектов стандартов.

В C++ к самим данным всегда могут быть доступны другие механизмы. Цель состоит в том, чтобы препятствовать случайному доступу, даже если вредоносный доступ по-прежнему возможен.

Смежные вопросы