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

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


компонентам разных классов (к компонентам с атрибутом private). Рассмотрим пример. Пусть заданы два графических объекта: circle (окружность) и rectangle (прямоугольник). Некоторая функция (назовем ее equal colour) должна сравнивать цвета этих объектов и возвращать результат, говорящие! о совпадении или несовпадении цветов (рис. 3.4). Цвет окружности и прямоугольника задается локальным компонентом соответствующих объектов (назовем их circle colour и rectangle colour). Другими словами, цвет окружности задается компонентом-данным с именем circle colour, имеющим атрибут private и заданным в объекте circle. Цвет же прямоугольника задается компонентом-данным с именем rectangle colour, имеющим атрибут private и заданным в объекте rectangle. В этом случае наша функция equal colour должна иметь доступ к локальным компонентам разных объектов. В этом случае она должна быть компонентом-функцией одновременно объекта circle и объекта rectangle, но, согласно правилам языка С++, это невозможно. Конечно, можно найти какой-то способ решения данной задачи, однако основная идея хорошего языка программирования заключается в том, чтобы предоставить пользователю этого языка естественные, простые и удобные средства для решения различных практических задач. Другими словами, задача должна решаться очевидными методами, а не путем изобретения изощренных приемов.

Объект класса окружность

Объект класса прямоугольник

private: (локальный) circle colour (цвет окружности)


private: (локальный)

rectangle colour (цвет прямоугольника)

Рис. 3.4. Для получения доступа к локальным компонентам объектов разных классов функция equal colour должна бытьобъявлена со спецификатором

friend



void equal colour (circle c, rectangle r) { if(c.colour == r.colour) return true; else return false;

В целом функции со спецификатором friend являются обычными глобальными функциями (конечно, если они не объявлены в другом классе), какими являются функции языка С или функции, объявленные и описанные за пределами классов в языке С++. Единственное их отличие заключается в том, что они имеют право доступа к локальным компонентам класса.

Поскольку функции со спецификатором friend не являются компонентами класса, то они не имеют и не могут использовать указатель this.

Объявление функции со спецификатором friend в пределах класса X является действительно объявлением. Оно вводит имя функции в границы класса X. Это объявление можно поместить в любую секцию класса (public, private или protected). В любом случае friend функция является глобальной и неважно, в какой секции она объявлена. Поскольку friend функции объявляются в классе X, то они могут рассматриваться как часть интерфейса класса X, другими словами, как часть функций класса X, осуществляющих взаимодействие с внещней средой.

В язык С++ введен спецификатор friend. Если некоторая функция определена как friend функция для некоторого класса X, то:

-♦ она не является компонентом-функцией этого класса;

-♦ она имеет доступ ко всем компонентам этого класса (т. е. к компонентам с атрибутами private, public и protected). Некоторая функция является friend функцией, если она объявлена со спецификатором friend, например:

class circle {

int colour, x,y,radius; public:

friend int equal colour(circle c, rectangle r);



Компонент-функция одного класса может быть объявлена со спецификатором friend для другого класса, например:

class X {

int function of X(. i .);

class Y {

friend int X:: function of X(. . .);

в этом случае function of X имеет доступ к локальным компонентам класса Y. В примере было использовано полное имя функции, представленное в виде: X:: function of X(. . .). Запись вида X:: function of X(. . .) говорит о том, что function of X(. . .) принадлежит классу X. Другими словами, это компонент-функция. Спецификатор friend разрешает этой функции иметь доступ к локальным компонентам класса Y. Почему класса Y? Потому, что функция function of X(. . .) объявлена в этом классе со спецификатором friend.

Все функции одного класса можно объявить со спецификатором friend по отношению к другому классу. Для этого разрешается использовать следующую сокращенную запись:

class X {

friend class Y;

В этом случае все компоненты-функции класса У имеют спецификатор friend для класса X, т. е. все они имеют доступ к локальным компонентам класса X.

Рассмотрим примеры. Первая программа показывает, как можно сравнить компоненты объектов разных классов, имеющие атрибут private. #include <iostreanfi.h>

class my class2; это неполное объявление class my class1 { int a;

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



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

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