почему работает этот код?
От: Hard_Club  
Дата: 27.12.11 10:41
Оценка: :)))
struct A
{
void setA(int _a) {a = _a;};
private:
int a;
};

int _tmain(int argc, _TCHAR* argv[])
{
A a;
a.setA(1);

A b = a;

b.setA(2);
a = b;

return 0;
}

Мембер а — приватный, а в struct A нет friend деклараций.
Re: почему работает этот код?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 27.12.11 10:43
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Мембер а — приватный, а в struct A нет friend деклараций.


Так нигде и нет обращений к мемберу a...
Re: почему работает этот код?
От: Сыроежка  
Дата: 27.12.11 10:48
Оценка: -3
Здравствуйте, Hard_Club, Вы писали:

H_C>struct A

H_C>{
H_C> void setA(int _a) {a = _a;};
H_C>private:
H_C> int a;
H_C>};

H_C>int _tmain(int argc, _TCHAR* argv[])

H_C>{
H_C> A a;
H_C> a.setA(1);

H_C> A b = a;


H_C> b.setA(2);

H_C> a = b;

H_C> return 0;

H_C>}

H_C>Мембер а — приватный, а в struct A нет friend деклараций.

Я уже заметил, что вы не в состоянии членораздельно излагать свои мысли. Дети ито лучше это делают!
Во-первых, что не должно работать?! Вы в состоянии это выразить? И причем здесь спецификатор friend? В каком месте вашего кода он должен использоваться?
Меня можно встретить на www.cpp.forum24.ru
Re[2]: почему работает этот код?
От: Hard_Club  
Дата: 27.12.11 11:36
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>Здравствуйте, Hard_Club, Вы писали:


H_C>>struct A

H_C>>{
H_C>> void setA(int _a) {a = _a;};
H_C>>private:
H_C>> int a;
H_C>>};

H_C>>int _tmain(int argc, _TCHAR* argv[])

H_C>>{
H_C>> A a;
H_C>> a.setA(1);

H_C>> A b = a;


H_C>> b.setA(2);

H_C>> a = b;

H_C>> return 0;

H_C>>}

H_C>>Мембер а — приватный, а в struct A нет friend деклараций.

С> Я уже заметил, что вы не в состоянии членораздельно излагать свои мысли. Дети ито лучше это делают!
С>Во-первых, что не должно работать?! Вы в состоянии это выразить? И причем здесь спецификатор friend? В каком месте вашего кода он должен использоваться?

обращение к private-мемберам другого екземпляра того же класса, например в такой ситуации:

struct A
{
void copyFrom(A &_source) {a = _source.a;};
private:
int a;
};
Re[3]: почему работает этот код?
От: Сыроежка  
Дата: 27.12.11 11:50
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Здравствуйте, Сыроежка, Вы писали:


С>>Здравствуйте, Hard_Club, Вы писали:


H_C>>>struct A

H_C>>>{
H_C>>> void setA(int _a) {a = _a;};
H_C>>>private:
H_C>>> int a;
H_C>>>};

H_C>>>int _tmain(int argc, _TCHAR* argv[])

H_C>>>{
H_C>>> A a;
H_C>>> a.setA(1);

H_C>>> A b = a;


H_C>>> b.setA(2);

H_C>>> a = b;

H_C>>> return 0;

H_C>>>}

H_C>>>Мембер а — приватный, а в struct A нет friend деклараций.

С>> Я уже заметил, что вы не в состоянии членораздельно излагать свои мысли. Дети ито лучше это делают!
С>>Во-первых, что не должно работать?! Вы в состоянии это выразить? И причем здесь спецификатор friend? В каком месте вашего кода он должен использоваться?

H_C>обращение к private-мемберам другого екземпляра того же класса, например в такой ситуации:


H_C>struct A

H_C>{
H_C> void copyFrom(A &_source) {a = _source.a;};
H_C>private:
H_C> int a;
H_C>};



Дело втом, что управление доступом private определяется следующим образом ( Стандарт С++ 2003 11.1 ): "private, that is, its name can be used only by members and friends of the class in which it is declared;"
То есть здесь говорится не о членах коонкретного объекта, а о членах класса и о членах друзей класса. То есть члены класса иогут обращаться к закрытым членам класса. Именнно это позволяет компилятору самостоятельно генерировать конструктор копирования по умолчанию и копирующий оператор присваивания. Если бы этого не было бы, то компилятор не смог бы генерировать эти специальные функции класса. То есть изначально исходили из концепции языка С, что объект структуры одного типа может быть присвоен объекту структуру того же типа, так как в С нет управления доступом.
Меня можно встретить на www.cpp.forum24.ru
Re: почему работает этот код?
От: Igore Россия  
Дата: 27.12.11 12:09
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>struct A

H_C>{
H_C> void setA(int _a) {a = _a;};
H_C>private:
H_C> int a;
H_C>};

H_C>int _tmain(int argc, _TCHAR* argv[])

H_C>{
H_C> A a;
H_C> a.setA(1);

H_C> A b = a;


H_C> b.setA(2);

H_C> a = b;

H_C> return 0;

H_C>}

H_C>Мембер а — приватный, а в struct A нет friend деклараций.


Прочитай про default copy constructor, assignment operator.
Re[4]: почему работает этот код?
От: Hard_Club  
Дата: 27.12.11 12:15
Оценка:
С>Дело втом, что управление доступом private определяется следующим образом ( Стандарт С++ 2003 11.1 ): "private, that is, its name can be used only by members and friends of the class in which it is declared;"
С>То есть здесь говорится не о членах коонкретного объекта, а о членах класса и о членах друзей класса. То есть члены класса иогут обращаться к закрытым членам класса. Именнно это позволяет компилятору самостоятельно генерировать конструктор копирования по умолчанию и копирующий оператор присваивания. Если бы этого не было бы, то компилятор не смог бы генерировать эти специальные функции класса. То есть изначально исходили из концепции языка С, что объект структуры одного типа может быть присвоен объекту структуру того же типа, так как в С нет управления доступом.

А можно ли явно запретить доступ к private-мемберам из других екземпляров?
Re[5]: почему работает этот код?
От: Сыроежка  
Дата: 27.12.11 12:26
Оценка:
Здравствуйте, Hard_Club, Вы писали:

С>>Дело втом, что управление доступом private определяется следующим образом ( Стандарт С++ 2003 11.1 ): "private, that is, its name can be used only by members and friends of the class in which it is declared;"

С>>То есть здесь говорится не о членах коонкретного объекта, а о членах класса и о членах друзей класса. То есть члены класса иогут обращаться к закрытым членам класса. Именнно это позволяет компилятору самостоятельно генерировать конструктор копирования по умолчанию и копирующий оператор присваивания. Если бы этого не было бы, то компилятор не смог бы генерировать эти специальные функции класса. То есть изначально исходили из концепции языка С, что объект структуры одного типа может быть присвоен объекту структуру того же типа, так как в С нет управления доступом.

H_C>А можно ли явно запретить доступ к private-мемберам из других екземпляров?


Я такой синтаксической конструкции не знаю, которая позволяет это делать. то есть когда вы определяете класс, то еще совершенно ничего не известно, какие объекты этого класса будут созданы. Определение класса является описанием типа. И все объекты класса имеют одинаковый тип.
Меня можно встретить на www.cpp.forum24.ru
Re[3]: почему работает этот код?
От: MasterZiv СССР  
Дата: 27.12.11 14:02
Оценка:
On 12/27/2011 03:36 PM, Hard_Club wrote:

> обращение к private-мемберам другого екземпляра того же класса, например в такой

> ситуации:

В С++ обращение к приватным данным другого экземпляра этого же класса
разрешается (в некоторых других ОО-языках запрещается, например, в Smalltalk).
Posted via RSDN NNTP Server 2.1 beta
Re[5]: почему работает этот код?
От: MasterZiv СССР  
Дата: 27.12.11 14:03
Оценка:
> А можно ли явно запретить доступ к private-мемберам из других екземпляров?

Нельзя. (средствами языка).
Posted via RSDN NNTP Server 2.1 beta
Re[5]: почему работает этот код?
От: Кодт Россия  
Дата: 27.12.11 16:39
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>А можно ли явно запретить доступ к private-мемберам из других екземпляров?


Можно запретить конкретно конструктор копирования и оператор присваивания. Спасёт тебя?
Перекуём баги на фичи!
Re[5]: почему работает этот код?
От: b-3 Россия  
Дата: 27.12.11 18:33
Оценка:
Здравствуйте, Hard_Club, Вы писали:

С>>Дело втом, что управление доступом private определяется следующим образом ( Стандарт С++ 2003 11.1 ): "private, that is, its name can be used only by members and friends of the class in which it is declared;"


H_C>А можно ли явно запретить доступ к private-мемберам из других екземпляров?


Защититься от явного:
A a,b;
::memcpy(&a, &b, sizeof(A));

в сях/в плюсах вы в принципе не сможете, даже переопределив все конструкторы. Сформулируйте цель (т.е. "я написал вот так: X, но мне не нравится, что другой программист может сделать Y") и можно будет обсудить способы этого избежать. Есть широкий набор методов, от виртуального интерфейса и opaque pointer-ов до всяких тяжеловесных технологий. Осталось только выяснить, чего вы хотите добиться

b-3
Забанен с формулировкой "клинический дисидент".
Re: почему работает этот код?
От: NiJazz Австралия  
Дата: 30.12.11 14:00
Оценка: 1 (1)
Здравствуйте, Hard_Club, Вы писали:

H_C>Мембер а — приватный, а в struct A нет friend деклараций.


Если не объявлять вручную конструктор копирования, компилятор генерирует по-умолчанию простейший его вариант — поочередное присваивание каждого члена структуры, а любой приватный член доступен любому методу.
Re: почему работает этот код?
От: flamingo  
Дата: 12.01.12 16:38
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>struct A

H_C>{
H_C> void setA(int _a) {a = _a;};
H_C>private:
H_C> int a;
H_C>};

H_C>int _tmain(int argc, _TCHAR* argv[])

H_C>{
H_C> A a;
H_C> a.setA(1);

H_C> A b = a;


H_C> b.setA(2);

H_C> a = b;

H_C> return 0;

H_C>}

H_C>Мембер а — приватный, а в struct A нет friend деклараций.


А что здесь такого, что не могло бы работать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.