Правила программирования на С и С++. Главы 7-8
Страница 39. Глава 8.Г. Конструкторы, деструкторы и operator=( )


 

Глава 8.Г. Конструкторы, деструкторы и operator=( )

Функции конструкторов, деструкторов и операций operator=() имеют ту особенность, что их создает компилятор в том случае, если не создаете вы. Генерируемый по умолчанию компилятором конструктор (не имеющий аргументов) и генерируемый компилятором деструктор нужны для создания указателя на таблицу виртуальных функций (подробнее об этом вскоре).

Генерируемый компилятором конструктор копии (чьим аргументом является ссылка на текущий класс) нужен еще по двум причинам, кроме таблицы виртуальных функций. Во-первых, код на С++, который выглядит как на С, должен и работать, как С. Так как правила копирования, которые относятся к классу, относятся также и к структуре, поэтому компилятор будет вынужден обычно генерировать конструктор копии в структуре, чтобы обрабатывать копирование структур в стиле С. Этот конструктор копии используется явно подобным образом:

some_class x; // конструктор по умолчанию

some_class y = x; // конструктор копии

но кроме этого он используется и неявно в двух ситуациях. Первой является вызов по значению: some_class x;

f( some_class x ); // передается по значению, а не по ссылке.

// ... // вызывается конструктор копии для передачи x

f( x ); // по значению. Оно должно скопироваться в стек.

Второй является возврат по значению: g() // Помните, что x - локальная, автоматическая переменная.

{ // Она исчезает после возвращения функцией значения.

some_class x; // Оператор return после этого должен скопировать x куда-нибудь

return x; // в надежное место (обычно в стек после аргументов).

} // Он использует для этой цели конструктор копии.

Генерируемая компилятором функция-операция operator=() нужна лишь для поддержки копирования структур в стиле С там, где не определена операция присваивания.

 
« Предыдущая статья   Следующая статья »