Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ekzamen_OPAM_vidpovidi_teoretichni.doc
Скачиваний:
4
Добавлен:
22.09.2019
Размер:
214.53 Кб
Скачать
  1. Захищені поля класу

  2. Дружні функції

Дружні функції застосовуються для доступу до прихованих полів класу і є альтернативою методам. Метод, як правило, використовується для реалізації властивостей об'єкту, а у вигляді дружніх функцій оформляються дії, не представляючі властивості класу, але концептуально що входять в його інтерфейс і потребуючі в доступі до його прихованих полів, наприклад, перевизначення операції виведення об'єктів. Правила опису і особливості дружніх функцій:

1. Дружня функція оголошується всередині класу, до елементів якого їй потрібен доступ, з ключовим словом friend. Як параметр їй повинен передаватися об'єкт або посилання на об'єкт класу.

2. Дружня функція може бути звичайною функцією або методом друго­го раніше визначеного класу. На неї не розповсюджується дія специ­фікаторів доступу, місце розміщення її оголошення в класі байдуже.

Одна функція може бути дружньою відразу декільком класам.

  1. Дружні класи

Якщо всі методи якого-небудь класу повинні мати доступ до прихованих полів іншого, весь клас оголошується дружнім за допомогою ключового слова friend. В наведеному прикладі клас mistress оголошується дружнім класу hero:

class hero{

friend class mistress;

}

class mistress{

void fl();

void f2();

}

Функції fl і f2 є дружніми по відношенню до класу hero (хоча і описані без ключового слова friend) і мають доступ до всіх його полів. Оголошення friend не є специфікатором доступу і не успадковується.

  1. Масиви об’єктів

В мові C++ масиви можуть складатися з об'єктів. З синтаксичної очки зору оголошення масиву об'єктів нічим не відрізняється від оголошення масиву вбудованого типу. Якщо в класі визначений конструктор з параметрами, кожний об'єкт в масиві ініціалізувався за допомогою списку ініціалізації, як це прийнято для масивів будь-якого типу. Проте точний вид списку ініціалізації залежить від кількості пара­метров конструктора.

Якщо конструктор має лише один параметр, можна просто за­дати список початкових значень, використовуючи звичайні синтаксичні конструкції, призначені для ініціалізації масивів. В міру створення елементів масиву ці значення по черзі присвоюються параметру конструктора.

  1. Ініціалізовані масиви об’єктів 44. Неініціалізовані масиви об’єктів

Особлива ситуація виникає, коли необхідно створити масиви об'єктів, які ініціалізували. Розглянемо наступний клас.

class cl {

int і;

public:

cl(int j) { i=j;} // Конструктор

int get_i() { return і;}

};

Тут в класі cl визначений конструктор з одним параметром. Це значить, що будь-який масив такого типу повинен ініціалізуватися.

Таким чином, масив не можна оголосити звичайним чином

cl а[9]; // Помилка, конструктору необхідний список ініціалізації

Цей оператор не працює, оскільки передбачається, що клас cl не має параметрів, оскільки в оголошенні масиву не вказаний список ініціалізації. Проте клас cl не містить конструкторів, які не мають параметрів. Отже, оскільки даному оголошенню не відповідає жоден конструктор, компілятор видасть повідомлення про помилку. Щоб вирі­шити цю проблему, необхідно перенавантажувати конструктор, додавши варіант, який не має параметрів. Тепер в програмі можна оголосити обидва види масиву.

class cl {

int і; public:

cl() { і=0; } // Викликається для неініціалізованих масивів

cl(int j) { i=j;}// Викликається для масивів які інціалізуються

int get_i

{ return і;}

};

В такому варіанті програми допускаються наступні оператори.

cl al[3]= {3, 5, 6}; // Масив який ініціалізується

cl а2[34]; // Неініціалізований масив

Особлива ситуація виникає, коли необхідно створити масиви об'єктів, які

неініціалізували.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]