Страустрап Бьярн
Шрифт:
Для массивов объектов типа класс используются глобальные функции operator new и operator delete (§R.5.3.3, §R.5.3.4).
Поскольку функции X::operator new и X::operator delete статические, они не могут быть виртуальными. Функция operator delete, которая вызывается из деструктора для освобождения памяти, выбирается по обычным правилам областей видимости, например:
В этом примере память для объекта класса D выделяется с помощью D::operator new, а благодаря наличию виртуального деструктора, освобождается с помощью D::operator delete.
R.12.6 Инициализация
Объект класса без конструкторов, без частных или защищенных членов, без виртуальных функций и без базовых классов можно инициализировать с помощью списка инициализаторов (§R.8.4.1). Объект класса с конструктором должен инициализироваться или иметь стандартный конструктор (§R.12.1). Стандартный конструктор используется для объектов, которые не проходят явной инициализации.
R.12.6.1 Явная инициализация
Объекты классов с конструкторами (§R.12.1) можно инициализировать списком выражений, заключенным в скобки. Этот список считается списком фактических параметров для вызова конструктора, производящего инициализацию. Иначе, в качестве инициализатора задается с помощью операции = одно значение. Оно используется как фактический параметр для конструктора копирования. Обычно можно обойтись без вызова конструктора копирования, например:
Перегрузка операции присваивания = не оказывает влияние на инициализацию.
Инициализация, происходящая при передаче фактических параметров и при возврате из функции, эквивалентна инициализации вида
Инициализация, происходящая в выражении операции new (§R.5.3.3) и при инициализации базовых классов и членов, эквивалентна инициализации вида
Для массивов объектов класса с конструкторами используются при инициализации (§R.12.1) конструкторы как и для одиночных объектов. Если оказалось, что инициализаторов в списке меньше, чем элементов массива, используется стандартный конструктор (§R.12.1). Если его нет, список инициализаторов должен быть полным. Приведем пример:
Здесь v[0] и v[3] инициализируются значением complex::complex(double), v[1] инициализируется complex::complex(double,double), а v[2], v[4] и v[5] инициализированы complex::complex.
Объект класса M может быть членом класса X в одном из следующих случаев:
(1) M не имеет конструктора;
(2) M имеет стандартный конструктор;