Конструктор является функцией-элементом с тем же именем, что и ее класс. Она вызывается компилятором всегда, когда создается представитель класса. Если вы не определили никаких конструкторов, компилятор генерирует конструктор по умолчанию (не имеющий параметров). Для конструкторов выполняются следующие правила:
• для конструктора не указывается возвращаемый тип;
• конструктор не может возвращать значение;
• конструктор не наследуется;
• конструктор не может быть объявлен как const, volatile, virtual или static.
Элементы-данные класса обычно инициализируются в теле конструктора. Однако определение конструктора может также содержать список инициализации элементов. Список инициализации элементов отделяется двоеточием : от заголовка определения функции и содержит элементы данных (и базовые классы), разделенные запятыми. Для каждого элемента указывается один или несколько параметров, используемых при инициализации.
Следующий пример показывает два сходных класса с конструкторами, применяющими два метода инициализации. Первый использует список инициализации, а второй присваивает элементам значения в теле конструктора.
Например:
class CXYValue
{
int iX, iY;
public:
CXYValue(int _iX, int _iY) : iX(_iX), iY(_iY){};
};
class CXYValue
{
int iX, iY;
public:
CXYValue(int _iX, int _iY)
{ iX = _iX; iY = _iY; };
};
Инициализация полей с помощью списка инициализации происходит до начала исполнения тела конструктора, что в некоторых ситуациях бывает важно. Хотя для большинства элементов данных применение списка инициализации данных не является обязательным, он является единственным методом инициализации элементов-констант и ссылок. Если элемент класса является объектом, конструктор которого требует спецификации одного или нескольких параметров, то список инициализации также будет для него единственно возможным механизмом инициализации.
Если при определении какого-то класса не было явно определено ни одного конструктора, то компилятор попытается автоматически сгенерировать для этого класса конструктор без параметров, называемый конструктором по умолчанию. Конструктор по умолчанию, сгенерированный компилятором, неявно вызывает конструкторы по умолчанию для членов класса и конструкторы базовых классов.
Так как константы и ссылки должны быть проинициализированы, класс, содержащий члены, являющиеся константами или ссылками, не может быть сконструирован по умолчанию, если только программист не предоставил конструктор явно. Например:
struct X
{
const int a;
const int &r;
};
X x; //ошибка: нет конструктора по умолчанию для x
Конструкторы по умолчанию можно вызывать явно. Встроенные типы также имеют конструкторы по умолчанию.
Конструктор может быть перегружен. Например, дополним класс
CXYValue конструктором по умолчанию, задающим стартовые значения полям iX и iY:
class CXYValue
{
int iX, iY;
public:
CXYValue () : iX(0), iY(0){};
CXYValue (int _iX, int _iY) : iX(_iX), iY(_iY){};
};
Теперь у нас имеется два явно определенных конструктора с одним и тем же именем CXYValue. Какой из этих двух конструкторов будет исполняться во время создания нового объекта зависит от того, сколько аргументов используется при вызове:
CXYValue c1; //вызывается первый конструктор
CXYValue c2(1, 17); //вызывается второй конструктор
|