Дружні функції і класи

CharToOem ( "Площа трикутника", S);

У наведеному прикладі оголошений клас точки Dot і вирішується завдання обчислення відстані між двома точками. Завдання вирішена трьома різними способами.

Функція doubleDot. Dist (Dot B) const є членом класу Dot і повертає значення відстані між поточною і заданої точками. Специфікатор const вказує компілятору, що стан поточного об'єкта не повинна змінюватися. Як параметр функція отримує цілком об'єкт типу Dot. який займає в пам'яті 17 байт. Функція-член класу викликається оператором: A .Dist (B), де об'єкт А є поточним, а об'єкт В - параметром.

Функція friend doubleDist (constDot A. constDot B) повертає значення відстані між двома заданими точками. Специфікатор const перед параметрами вказує компілятору, що стан параметрів не повинно змінюватися. Як параметри функція одержує два посилання на об'єкти типу Dot. які займає в пам'яті по 4 байта кожен. Функція викликається оператором Dist (A. B). Оскільки функція є дружньою класу Dot. то доступ до закритих членам x і y параметрів A і B. які є об'єктами типу Dot. здійснюється за допомогою оператора точка, наприклад: A .x.

Використання покажчиків і посилань на об'єкти в якості параметрів функції замість об'єктів зменшує обсяг пам'яті, що резервується функцією, і час її виклику.

Наведений вище приклад містить також рішення задачі обчислення площі трикутника за допомогою глобальної функції doubleArea (constDot A. constDot B. constDot C), яка отримує три посилання на точки і повертає значення площі трикутника. Функція викликається оператором Area (A. B. С). Незважаючи на те, що функція використовує об'єкти типу Dot. тіло функції не містить звернень до закритих членів класу. Тому ми не стали оголошувати функцію як дружню.

Функції, дружні окремих класів

Функція може бути дружньою відразу декількох класів. У наведеному нижче прикладі вирішується завдання обчислення координат кінця заданого вектора, початок якого знаходиться в заданій точці.

class Dot // клас точки

Vec AC ( "AC", 2, 2);

У наведеному прикладі оголошені класи точки Dot і вектора Vec і поставлена ​​задача вирішена трьома різними способами.

Функція voidDot. EndVec (constDot A. constVec AB) є членом класу Dot. отримує константні посилання на вектор і початок вектора і передає координати кінця вектора в поточну точку. Оскільки закриті члени-дані класу Vec недоступні в класі Dot. то ми використовуємо відкриті функції-члени класу Vec - GetY () і GetX (). Функція-член класу викликається оператором: C .EndVec (A. AC), де об'єкт C є поточним, а об'єкти A і AC - параметрами.

Функція voidVec. EndVec (constDot A. Dot B) є членом класу Vec. отримує константну посилання на початок вектора і посилання на кінець вектора. При обчисленнях використовуються значення проекцій поточного вектора. Оскільки закриті члени-дані класу Dot недоступні в класі Vec. то ми використовуємо відкриті функції-члени класу Dot - GetX (), GetY (), SetX (), SetY (). Функція-член класу викликається оператором: AC .EndVec (A. C), де об'єкт AC є поточним, а об'єкти A і C - параметрами.

Функція friend voidEndVec (constDot A. constVec AB. Dot B) є дружньою класів Dot і Vec. Для цього вона оголошена в обох класах з ключовим словом friend. Функція отримує константні посилання на початок вектора і вектор, а також посилання на кінець вектора. Оскільки закриті дані-члени обох класів Dot і Vec доступні дружньої функції, то ми використовуємо оператор «точка» для доступу до цих даних. Дружня функція викликається оператором EndVec (A. AC. C).

Функції-члени, дружні іншого класу

Функція може бути членом одного класу і дружній іншого класу. Для демонстрації цього синтаксичного прийому трохи змінимо попередній приклад.

Виклик наведених функцій не відрізняється від попереднього прикладу.

Клас не може оголосити сам себе другом деякого іншого класу. Для того, щоб механізм дружності спрацював, він повинен бути оголошений дружнім в цій другій класі.

friend classVec; // клас Vec оголошений одним класу Dot

Схожі статті