|
Программирование >> Программирование на языке c++
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(...)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |