Поделиться через


Правила объявления конструкторов

Конструктор имеет то же имя, что и класс. Можно объявить любое количество конструкторов в соответствии с правилами перегруженных функций. (Дополнительные сведения см. в разделе Перегрузка.)

class-name  (  argument-declaration-list  )

Заметки

Список argument-declaration-list может быть пустой.

В C++ определено два специальных типа конструкторов: конструктор по умолчанию и конструктор копии. Они описаны в следующей таблице.

Конструктор по умолчанию и конструктор копии

Тип конструктора

Аргументы

Назначение

Конструктор по умолчанию

Может вызываться без аргументов

Создание объекта по умолчанию типа класса

Конструктор копии

Может принимать один аргумент ссылки на тот же тип класса

Копирование объектов типа класса

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

Если конструкторы не задаются, компилятор пытается создать конструктор по умолчанию. Если конструктор копии не задается, компилятор пытается создать его. Такие создаваемые компилятором конструкторы считаются открытыми функциями-членами. При определении конструктора копии, первым аргументом которого является объект, а не ссылка, возникает ошибка.

Созданный компилятором конструктор по умолчанию устанавливает объект (инициализирует vftables и vbtables, как было описано выше) и вызывает конструкторы по умолчанию базовых классов и членов, но не выполняет никаких других действий. Конструкторы базовых классов и членов вызываются, только если они существуют, доступны и однозначны.

Созданный компилятором конструктор копии устанавливает новый объект и выполняет почленное копирование содержимого объекта, который нужно скопировать. Если конструкторы базового класса или членов существуют, они вызываются; в противном случае выполняется побитовое копирование.

Если все базовые классы и классы членов класса type имеют конструкторы копий, которые принимают аргумент const, то конструктор копии, созданный компилятором, принимает один аргумент типа const type**&. В противном случае созданный компилятором конструктор копии принимает один аргумент типа type&**.

Конструктор можно использовать для инициализации объекта const или volatile, но объявить конструктор как const или volatile невозможно. Единственный допустимый класс хранения для конструктора — inline; использование с конструктором любого другого модификатора класса хранения, включая ключевое слово __declspec, приводит к ошибке компилятора.

Соглашение о вызовах stdcall используется для статических функций-членов и глобальных функций, объявленных с ключевым словом __stdcall , в которых не используется переменное число аргументов. Если ключевое слово __stdcall используется в нестатической функции-члене, например в конструкторе, компилятор использует соглашение о вызовах thiscall.

Конструкторы базовых классов не наследуются производными классами. Объект типа производного класса создается, начиная с компонентов базового класса, а затем перемещается в компоненты производного класса. Компилятор использует конструктор каждого базового класса при инициализации этой части полного объекта (за исключением случаев виртуального наследования, описанных в разделе Инициализация базовых классов).

См. также

Ссылки

Конструкторы (C++)