Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Конструктори з параметрами в С++. Деструктори




Class t3

Class t2

Class t1

Friend class ім'я класу

Дружні функції і класи в С++.

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

 

Ключове слово friend - специфікатор функції, який дає функциі- не члену класу доступ до прихованих членів класу. Він використовується для того, щоб вийти за строгі рамки типізації і заховання даних в С++.

 

Одна з причин їх використання полягає втому, що деякі функції потребують привілейованого доступу більш, чим до одного класу. Друга причина - friend-функція передає всі параметри через список параметрів, і значення кожного з них підлегло перетворенню, сумісному з призначенням. Такі перетворення застосовуються до явно переданих аргументів-класів і тому особливо корисні у випадках перевантаження оператора. Оголошення friend функції повинне з'являтися усередині оголошення класу, якому вона дружня. Імені функції передує ключове слово friend, і її оголошення може знаходиться як в public так і в private частини класу, що не вплине на значення. Функція-член одного класу може бути friend-функцією іншого класу. Це відбувається тоді, коли функція-член оголошена в friend класі з використанням оператора дозволу контексту для визначення імені функції дружнього класу. Якщо всі функції-члени одного класу є friend-функціями іншого класу, то це можна визначити записом:

 

{

friend void а(); // friend-функція

int b(); // функція-член

};

{

friend int t1::b(); // функція-член класу t1 має доступ до всіх прихованих полів класу t2

};

{

friend class t1; // всі функції-члени класу t1 мають доступ до всіх полів класу t3

};

Клас можна визначити за допомогою конструкції

тип_класу им’я_класу {компоненти класу};

· тип класу – одно з службових слів class, struct, union;

· ім’я_класу – ідентифікатор (задається користувачем);

· компоненти класу – визначення і об’явлення даних, що належать класу функцій.

Клас: class name

{
int data; // Елемент данних
void show (int); // Функция-елемент
};

Необхідність у ініціаллізації ще більш часто проявляється при роботі з об'єктами. Дійсно, якщо звернутися до реальних проблем, то, фактично, для кожного створюваного вами об'єкта потрібно якогось виду ініціалізація. Для вирішення цієї проблеми в C + + є функція-конструктор (Constructor function), яка включається в опис класу. Конструктор класу визується щоразу під час створення об'єкта цього класу. Таким чином, будь-яка необхідна об'єкту ініціалізація за наявності конструктора виконується автоматично. Конструктор має те ж ім'я, що й клас, частиною якого він є, і не має що повертається значення.

Деструктор класу викликається при видаленні об'єкта. Локальні об'єкти видаляються тоді, коли вони виходять з області видимості. Глобальні об'єкекти видаляються при завершенні програми. Адреси конструктора і деструктора отримати неможливо.

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

Конструктор за замовчуванням. Так називають конструктор, який дозволяє створювати екземпляри класів з неявною ініціалізацією даних. Як вже зазначалось, такий конструктор автоматично створюється для класів, в яких не визначений власний конструктор. Проте, як тільки в класі визначається хоч один конструктор, такий автоматичний конструктор перестає діяти. В разі необхідності створення екземплярів без ініціалізації, варто визначити в класі конструктор за умовчанням. Найпростіший спосіб зробити це - перевантажити конструктор, або визначити умовчання для всіх його параметрів.

Конструктор копіювання. Справа полягає в тому, що параметр типу Student передається у функцію f () за значенням, а отже, створюється, а потім знищується зі стеку. Тому і виникає зайвий виклик деструктора. Але конструктор при створенні локального екземпляру класу у стеку не викликався! Дійсно створенням екземплярів, які необхідно ініціалізувати значенням вже існуючого екземпляру займається інший конструктор -так званий конструктор копіювання. В даному прикладі був викликаний такий конструктор, створений компілятором. Він просто поелементно копіює даний екземпляр. Але це не завжди доречно, адже, можливо, необхідне виділення пам'яті для даних членів, тощо. Для явного визначення конструктора копіювання необхідно дотримуватись особливого синтаксису: <ім'я_класу> (const <ім'я_класу> &);

Параметром конструктора копіювання є стала змінна-посилання на екземпляр класу. Його призначення - коректне створення копії екземпляру. Особливо важливо це у випадку, коли членами класу є вказівники, пам'ять під які виділяється оператором new. Адже тоді по-елементне копіювання копіює вказівник (поверхневе копіювання), а не об'єкт, на який він посилається, - для цього необхідне глибоке копіювання.

 

 




Поделиться с друзьями:


Дата добавления: 2015-05-23; Просмотров: 1535; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




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