Урок 142. Копирующая инициализация

   ⁄ 

 Обновлено 9 мая 2018  ⁄ 

⁄   787

Рассмотрим следующую строчку кода:

Здесь используется копирующая инициализация для инициализации целочисленной переменной a значением 7. С обычными переменными всё просто.

Однако с классами дела обстоят несколько сложнее, поскольку в их инициализации используются конструкторы. В этом уроке мы рассмотрим использование копирующей инициализации с классами.

Использование копирующей инициализации с классами

Рассмотрим следующую программу:

Результат выполнения:

7/1

Форма копирующей инициализации в примере выше обрабатывается точно так же, как и следующая:

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

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

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

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

НА КАНАЛ RAVESLI В TELEGRAM

@ravesli

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