Программирование >>  Программирование на языке c++ 

1 ... 30 31 32 [ 33 ] 34 35 36 ... 159


my class1(int А) : а(А) {};

class my class2 { int а;

friend void fun(my class1&,my class2&); public:

my class2(int A) : a(A) {};

void fun(my class1& M1,my class2& M2) { if (Ml.a == M2.a) cout equal\n ;

else cout << non equal\n ; }

void main(void)

{ my class1 mcl = 100,mc3 = 200; my class2 mc2 = 100;

fun(mc1,mc2); Результат: equal

mcl = mc3;

fun(mc1,mc2); Результат: non equal

Объявление class my class2; в начале программы является неполным. Оно вводит только имя класса my class2, которое используется в классе my classl. Выражение mcl=mc3; является допустимым в тех случаях, когда можно скопировать значения компонентов-данных одного объекта (тсЗ) в компоненты-данные другого объекта (mcl). Такое копирование не всегда допустимо и об этом еще будет говориться в § 5.5.

Вторая программа показывает, как объявить компонент-функцию одного класса со спецификатором friend для другого класса. #include <iostream.h> class X; неполное объявление класса class Y { int а; public:

Y(int А) : а{А) {};

void display(X* рХ); displayO - компонент-функция класса Y



class X { int а; public:

X(int А) : а{А) {};

friend void Y::display{X*); displayO - это friend класса X

void Y::display(X* pX)

{ cout pX->a Xf a endl; } void main{void) { Xmy X{100); Y my Y{200);

my Y.display(&my X); Результат: 100 200

Поскольку displayO - это компонент-функция класса Y, то она будет иметь указатели this для объектов класса Y (см. следующий пример). Однако по отношению к классу X - это внешняя функция (она не будет иметь указателей this для объектов класса X). Единственная особенность этой функции заключается в том, что она имеет доступ ко всем компонентам класса X.

Третий пример показывает, как можно объявить один класс в другом классе со спецификатором friend. #include <iostream.h> class X; неполное объявление класса class Y {int a; public:

Y(int A) : a(A) {};

void display(X* pX);

class X { int a; public:

X(int A) : a(A) {};

friend class Y; функции класса Y имеют доступ ко всем компонентам класса X



void Y::display(X* рХ)

{ cout рХ->а \t this -> а endl; } void main(void) { X my X(100); Y my Y(200);

my Y.display(&my X); Результат: 100 200

Рассмотрим описание функции: void Y::display(X* pX)

{ cout pX->a \t this -> a endl; }

Она является компонентом класса Y и поэтому имеет указатель this на объекты класса Y. Выражение this->a - это то же, что и просто а. Поскольку Y объявлен в классе X со спецификатором friend, функция displayO класса Y имеет доступ к локальному компоненту а класса X (см. выражение рХ->а).

В заключение перечислим основные свойства и правила использования спецификатора friend: -♦ friend функции не являются компонентами класса, но получают доступ ко всем его компонентам независимо от атрибутов этих компонентов;

-♦ если friend функции одного класса не являются компонентами другого класса, то они вызываются так же, как и обычные глобальные функции, т. е. в этом случае не надо использовать операторы . и ->;

-♦ если friend функции одного класса не являются компонентами другого класса, то они не имеют указателя this;

-♦ friend функции не наследуются в производных классах;

-♦ отношение friend не является транзитивным, т. е. из двух отношений А friend В и В friend С не следует, что А friend С.

3.8. Полные имена

компонентов класса

Полные имена используются, когда необходимо указать принадлежность компонента классу. Выражение X::d говорит о том, что данное d принадлежит классу X. Выражение X::f(...)



1 ... 30 31 32 [ 33 ] 34 35 36 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика