русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Дружественные функции


Дата добавления: 2013-12-23; просмотров: 1084; Нарушение авторских прав


Функция, не являющаяся членом класса, может иметь доступ к его частным членам в случае, если она объявлена другом (friend) класса. Например, в следующем примере функция F() объявлена другом класса C:

class C

{

public:

friend void F();

}

Как можно видеть, ключевое слово friend предшествует объявлению функции.

Одна из причин, почему язык C++ допускает существование функций-друзей, связана с той ситуацией, когда два класса должны использовать одну и ту же функцию. В качестве примера рассмотрим программу, в которой определяются два класса — line и box. Класс line содержит все необходимые данные и код для начертания горизонтальной пунктирной линии любой заданной длины, начиная с указанной точки с координатами (х, у) и с использованием заданного цвета. Класс box содержит необходимый код и данные для того, чтобы изобразить прямоугольник с заданными левой верхней и правой нижней точками указанным цветом. Оба класса используют функцию same_color() для того, чтобы определить, нарисованы ли линия и прямоугольник одним и тем же цветом. Объявление этих классов выполнено в следую­щем фрагменте программы:

class line;

class box

{

int color; // цвет прямоугольника

int upx, upy; // левый верхний угол

int lowx, lowy; // правый нижний угол

public:

friend int same_color(line l, box b);

void set_color(int c);

void define_box(int x1, int y1, int x2, int y2);

void show_box();

};

class line

{

int color;

int startx, starty;

int len;

public:

friend int same_color(line l, box b);

void set_color(int c);

void define_line(int x, int y, int l);

void show_line();

}

Функция same_color() не является членом ни одного из классов, но является другом обоих. Она возвращает истину, если объект типа line и объект типа box нарисованы одним и тем же цветом, и значение 0 — в противном случае. Следующий код определяет функцию same_color():



int same_color(line l, box b)

{

if(l.color == b.color) return 1;

return 0;

}

Как можно видеть, функция same_color() должна иметь доступ к частным частям обоих классов line и box. Поскольку она является другом каждого из классов, то она имеет право такого досту­па. Более того, обратим внимание, что поскольку функция same_color() не является членом, то для ее использования нет необходимости в операторе области видимости или в использовании имени класса. Обратим внимание, что для тех же целей можно было создать функцию-член со спецификатором доступа public, которая возвращала бы цвета объектов типа line и box, а также еще одну функцию для сравнения этих цветов. Однако такой подход потребовал бы дополнитель­ных вызовов функций, что в некоторых случаях неэффективно.

Обратим внимание на пустое объявление класса line, предшествующее объявлениям обоих клас­сов box и line. Поскольку функция same_color() в классе box ссылается на объект типа line до того, как класс line будет определен, то необходима предварительная (forward) ссылка на класс line. Если этого не будет сделано, то компилятор не поймет, что такое line, когда будет анализи­ровать объявление класса box. В языке C++ предварительная ссылка на класс состоит из ключево­го слова class, после которого следует имя класса.

Следующий пример показывает, как дружественная фун­кция может получать доступ к частным членам класса.

void main()

{

line l;

box b;

l.define_line(2, 2, 10); l.set_color(2);

b.define_box(2, 2, 10, 10); b.set_color(2);

if(same_color(l, b)) cout << "Are the same color.\n";

}

Имеется два важных ограничения применительно к дружественным функциям. Первое заключается в том, что производные классы не наследуют дружественных функций. Второе заключается в том, что дружественные функции не могут объявляться с ключевыми словами static или extern.



<== предыдущая лекция | следующая лекция ==>
Параметризованные конструкторы | Значения аргументов функции по умолчанию


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.