Урок 127. Анонимные объекты

   ⁄ 

 Обновлено 23 Мар 2018  ⁄ 

⁄   348

В некоторых случаях переменная может быть нам нужна только временно. Например:

В функции 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 (7 оценок, среднее: 5,00 из 5)
Загрузка...
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

ПОДПИСЫВАЙТЕСЬ

НА КАНАЛ RAVESLI В TELEGRAM

@ravesli

ПОДПИСАТЬСЯ БЕСПЛАТНО