Показуйте обмеження

Пам’ятайте, що коли ви перезавантажили операцію, то будь-якій людині, не знайомій з вашим лістінгом, потрібно багато вивчити, щоб зрозуміти, що насправді означає вираз

a=b+c;

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

 

Уникайте невизначеності

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

 

Не всі операції можуть бути перезавантажені

Не можуть бути перезавантаженими такі операції:

§ операція доступу до членів структури чи класу (.)

§ операція глобального дозволу (::)

§ операція умови (?:)

§ операція ->

 

Крім того, не можна створювати нові операції і намагатися їх перезавантажити, перезавантажувати можна лише існуючі операції

 

 

Підсумок

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

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

В таблиці відображені можливі варіанти перетворень.

  Процедура в класі призначення Процедура у вихідному класі
Основний в основний Вбудовані операції перетворення
Основний в клас Конструктор N/A
Клас в основний N/A Операція перетворення
Клас в клас Конструктор Операція перетворення

 


Питання по темі

1. Перезавантаження операцій

а) перетворює операції (operator) C++ для роботи з об’єктами

б) надає операціям С++ більше даних, ніж вони можуть обробити

в) надає нове значення існуючим у С++ операціям

г) створює нові операції С++

 

2. Скільки аргументів потрібно для визначення перезавантаженої унарної операції?

а) жодного

б) один

в) два

 

3. Припустимо, що існує клас С з об’єктами obj1, obj2, obj3. Вираз

obj1=obj2-obj3

працює правильно. Тут перезавантажена операція повинна:

а) приймати два аргументи

б) повертати значення

в) створювати іменований тимчасовий об’єкт

г) використовувати об’єкт, що викликав операцію, як операнд

 

4. Існують два оголошення, призначені для додавання двох об’єктів класу String.

void add(String s1, Strings2);

String operator+(String s)

Імені функції add відповідає:

а) аргумент (s)

б) об’єкт, що викликає операцію

в) операція (+)

г)значення, що повертається (типу String)

д) нема відповідності

 

 

5. Існують два оголошення, призначені для додавання двох об’єктів класу String.

void add(String s1, Strings2);

String operator+(String s)

Повернутому значенню типу void відповідає::

а) аргумент (s)

б) об’єкт, що викликає операцію

в) операція (+)

г)значення, що повертається (типу String)

д) нема відповідності

 

6. Існують два оголошення, призначені для додавання двох об’єктів класу String.

void add(String s1, Strings2);

String operator+(String s)

Першому аргументу s1 відповідає::

а) аргумент (s)

б) об’єкт, що викликає операцію

в) операція (+)

г)значення, що повертається (типу String)

д) нема відповідності

 

7. Існують два оголошення, призначені для додавання двох об’єктів класу String.

void add(String s1, Strings2);

String operator+(String s)

Другому аргументу s2 відповідає::

а) аргумент (s)

б) об’єкт, що викликає операцію

в) операція (+)

г)значення, що повертається (типу String)

д) нема відповідності

 

8. Існують два оголошення, призначені для додавання двох об’єктів класу String.

void add(String s1, Strings2);

String operator+(String s)

J,Об’єкту, що викликає функцію, відповідає::

а) аргумент (s)

б) об’єкт, що викликає операцію

в) операція (+)

г)значення, що повертається (типу String)

д) нема відповідності

 

9. Чи істинне твердження: перезавантажена операція завжди вимагає на один аргумент менше, ніж кількість операндів?

а) так

б) ні

 

10. Коли ви перезавантажуєте операцію арифметичного присвоювання, то результат:

а) передається об’єкту справа від операції

б) передається об’єкту зліва від операції

 

11. Для перетворення від визначеного користувачем класу до основного типу можна використати:

а) вбудовану операцію перетворення

б) конструктор з одним аргументом

в) перезавантажену операцію =

г) операцію перетворення, що є членом класу

 

12. Для перетворення від основного типу до визначеного користувачем класу можна використати:

а) вбудовану операцію перетворення

б) конструктор з одним аргументом

в) перезавантажену операцію =

г) операцію перетворення, що є членом класу

 

13. Чи є істинним твердження: вираз objA=objB буде причиною помилки компілятора, якщо об’єкти належать до різних типів?

а) так

б) ні

в) так, якщо відсутня операція перетворення типів

 

14. Якщо об’єкт objA належить до класу А, об’єкт objectB - до класу B, ми хочемо записати objA=objB і помістити функцію присвоювання в клас А, то який тип процедури можна використати?

а) вбудовану операцію перетворення

б) конструктор з одним аргументом

в) перезавантажену операцію =

 

15. Чи істинний вираз: компілятор не протестуватиме, якщо ми перезавантажимо операцію * для виконання ділення?

а) так

б) ні, але це зробить лістінг програми менш читабельним

 








Дата добавления: 2015-08-26; просмотров: 681;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

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

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.019 сек.