logo search
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.12.1 Конструкторы

Конструктором называется функция-член, имя которой совпадает с именем

класса, он используется для построения значений, имеющих тип данного

класса. Если в классе есть конструктор, то каждый объект этого класса

перед произвольным использованием будет инициализироваться, см.

$$R.12.6.

Конструктор может вызываться для объекта со спецификацией const

или volatile. Сам конструктор нельзя описывать со спецификацией

const или volatile ($$R.9.3.1). Конструктор также не может иметь

спецификацию virtual или static.

Конструкторы не наследуются, однако, стандартные конструкторы

и конструкторы копирования при необходимости создаются транслятором

($$R.12.8). Такие конструкторы являются общими.

Стандартным конструктором для класса X является такой конструктор

класса X, который можно вызывать без параметров. Стандартный

конструктор для класса X будет создан только тогда, когда для класса

X не описано ни одного конструктора.

Конструктором копирования для класса X называется конструктор,

который вызывается для копирования объекта класса X, т.е. вызывается

с одним параметром типа X. Например, X::X(const X&) и

X::X(X&, int=0) являются конструкторами копирования. Конструктор

копирования создается только тогда, когда не описано ни одного

конструктора копирования.

Конструктор копирования для класса X не должен иметь в качестве

параметра объект типа X, например X::X(X) незаконное обращение.

Конструктор для массива элементов вызывается в порядке

возрастания адресов элементов ($$R.8.2.4).

Если у класса есть базовые классы с конструктором или члены,

являющиеся объектами с конструктором, их конструкторы вызываются

прежде, чем конструктор производного класса. В $$R.12.6.2 объясняется

как задаются параметры для таких конструкторов и как определяется

порядок их вызова.

Объект класса с конструктором не может быть членом объединения.

Для конструктора не нужно указывать никакого типа возвращаемого

значения, даже void. В операторе return в теле конструктора нельзя

указывать возвращаемое значение. Не допустима операция взятия

адреса конструктора.

Конструктор можно явно использовать для создания объектов его

типа с помощью следующей записи:

имя-класса ( список-выражений opt )

Приведем пример:

complex zz = complex(1,2.3);

print( complex(7.8,1.2) );

Объект, созданный таким образом является безымянным (если только

конструктор не использовался для инициализации поименованной переменной

как zz выше), а время его жизни ограничено выражением, в котором

он был создан, см. $$R.12.2.

В конструкторе можно вызывать функцию-член, см. $$R.12.7.