Урок №150. Копіююча ініціалізація

  Юрій  | 

  Оновл. 17 Лют 2021  | 

 43

Розглянемо наступний рядок коду:

Тут використовується копіююча ініціалізація для ініціалізації цілочисельної змінної a значенням 7. Зі звичайними змінними все просто. Однак з класами справи йдуть трохи складніше, оскільки в їх ініціалізації використовуються конструктори. На цьому уроці ми розглянемо використання копіюючої ініціалізації з класами.

Використання копіюючої ініціалізації з класами

Розглянемо наступну програму:

Результат виконання програми:

7/1

Форма копіюючої ініціалізації в мові C++ у вищенаведеному прикладі обробляється точно так же, як і наступна:

А, як ми вже знаємо з попереднього уроку, це може призвести до виклику як Drob(int, int), так і конструктора копіювання Drob (який може бути проігнорований). Однак, оскільки гарантії на 100% ігнорування конструктора копіювання не надається, то краще уникати використання копіюючої ініціалізації при роботі з класами і замість неї використовувати пряму ініціалізацію або uniform-ініціалізацію, так як у випадку з використанням конструктора копіювання у вас може вийти наступний результат:

7

Замість необхідного:

7/1

Так як в конструкторі копіювання (який мова C++ надасть автоматично) значення за замовчуванням для m_denominator не буде.

Правило: Уникайте використання копіюючої ініціалізації при роботі з класами, замість неї використовуйте uniform-ініціалізацію.

Інші застосування копіюючої ініціалізації

Коли ви передаєте або повертаєте об’єкт класу по значенню, то в цьому процесі використовується копіююча ініціалізація. Розглянемо наступну програму:

Тут функція makeNegative() приймає об’єкт класу Drob по значенню і повертає його так само по значенню. Результат виконання програми:

Copy constructor worked here!
Copy constructor worked here!
-6/7

Перший виклик конструктора копіювання виконається при передачі sixSeven в якості аргументу в параметр d функції makeNegative(). Другий виклик виконається при поверненні об’єкта з функції makeNegative() назад в функцію main(). Таким чином, об’єкт sixSeven копіюється двічі.

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

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

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (Немає Оцінок)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *