Ф-ии — друзья и ф-ии – члены


Сущ-ет интерес к вопросу:”в каких случаях для доступа к закрытой части определяемого польз-ем типа исп-ть члены, а в к-их — друзей?. Нек-ые опер-ии должны быть членами:констр-ры, дестр-ры и вирт-ые ф-кции,но обычно это зав-т от выбора.
Р-им простой класс X:
class X {
// …
X(int); int m(); friend int f(X&);
};
Внешне не видно никаких причин делать f(X&) другом доп-но к члену X::m()(или наоб-т),чтобы реал-ть д-ия над классом X.Но член X::m() можно вызывать только для «настоящего объекта»,в то время как друг f() может вызыв-ся для объекта, созд-го с пом-ю неявного преобр-я типа.
Например:
void g() { 1.m(); // ошибка f(1); //
f(x(1));} Поэтому операция, изм-ая сост-ие объекта,должна быть членом, а не другом. Для определяемых польз-ем типов операции, треб-ие в случае фунд-ых типов операнд lvalue (=, *=, ++,*= и т.д.),наиболее ест-но определ-ся как члены. И наоб-т,если нужно иметь неявное преобр-ие для всех операндов операции,то реализующая ее ф-ия должна быть другом,ане членом.Эточасто имеет место для ф-ий, к-ые реал-ют операции,не треб-ие при применении к фунд-ым типам lvalue в кач-ве операндов(+, -, || и т.д.).Если никакие преобр-ия типа не опр-ны,то оказыв-ся,что нет ник-х сущ-ых оснований в пользу члена,если есть друг,к-ый пол-ет ссыл-ый пар-р,и наоб-т.

Загрузка...