Урок №135. Анонімні об’єкти

  Юрій  | 

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

 62

У деяких випадках в мові C++ змінна може бути потрібна тільки тимчасово. Наприклад:

У функції add() змінна result використовується як тимчасова змінна. Вона не має якогось особливого призначення, функція використовує її тільки для повернення значення.

Є простіший спосіб написати функцію add() — через анонімний об’єкт. Анонімний об’єкт — це значення без імені. Оскільки імені немає, то і способу посилатися на цей об’єкт за межами місця, де він створений — теж немає. Отже, анонімні об’єкти мають область видимості виразу і вони створюються, обробляються і знищуються в межах одного виразу.

Ось вищенаведена функція add(), але вже з використанням анонімного об’єкту:

При обчисленні виразу a + b, результат поміщається в анонімний об’єкт. Потім копія анонімного об’єкту повертається по значенню назад в caller, і анонімний об’єкт знищується.

Це працює не тільки зі значеннями, що повертаються, але і з параметрами функції. Наприклад, замість наступного:

Ми можемо написати наступне:

В цьому випадку вираз 4 + 2 генерує результат 6, який поміщається в анонімний об’єкт. Потім копія цього анонімного об’єкта передається в функцію printResult() (яка виводить значення 6) і знищується.

Зверніть увагу, наскільки чистішим став наш код — нам не потрібно захаращувати його тимчасовими змінними, які використовуються тільки один раз.

Анонімні об’єкти класу

Хоча у вищенаведених прикладах ми використовували тільки фундаментальні типи даних, анонімні об’єкти також можуть використовуватися і з класами. Достатньо просто не вказувати ім’я об’єкту:

У вищенаведеному прикладі рядок Dollars(8); створить анонімний об’єкт класу Dollars, ініціалізує його значенням 8, а потім знищить. У цьому контексті користі ми багато не отримаємо. Розглянемо приклад, де це може бути корисним:

Тут функція main() передає об’єкт dollars в функцію print(). Ми можемо спростити цю програму, використовуючи анонімні об’єкти:

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

7 dollars.

Тепер розглянемо складніший приклад:

У функції add() у нас є значення змінної sum класу Dollars, яке використовується в якості проміжного значення для зберігання результату і його повернення. І в функції main() у нас є значення змінної sum класу Dollars, яке також використовується, як проміжне.

Можна зробити простіше, використовуючи анонімні об’єкти:

Ця версія функції add() ідентична вищенаведеній функції add(), за винятком того, що замість окремого об’єкта використовується анонімний об’єкт класу Dollars. Також зверніть увагу, що в функції main() ми більше не використовуємо змінну з ім’ям sum. Замість неї ми використовуємо анонімне значення, що повертається, функції add()!

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

Висновки

Анонімні об’єкти в мові C++ використовуються для передачі або повернення значень без необхідності створювати велику кількість тимчасових змінних. Динамічне виділення пам’яті також виконується через анонімні об’єкти (тому адреса виділеної пам’яті повинна бути присвоєна вказівнику, інакше ми не мали б можливості посилатися/використовувати її).

Варто ще відзначити, що анонімні об’єкти розглядаються як r-values (а не як l-values, у яких є адреси). Це означає, що анонімні об’єкти можуть передаватися або повертатися тільки по значенню або по константному посиланню. В інших випадках повинна використовуватися змінна.

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

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

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (2 оцінок, середня: 5,00 з 5)
Loading...

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

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