{ int a;
float b;
public:
matr(){}; // конструктор по умолчанию
matr(int i,float j): a(i),b(j) {}
~matr(){};
};
int main()
{ matr mt(3,.5);
matr *p1=new matr[2]; // верно р1 − указатель на 2 объекта
matr *p2=new matr[2] (2,3.4); // неверно, невозможна инициализация
matr *p3=new matr (2,3.4); // верно р3 – инициализированный объект
}
Следует отметить, что в примере конструктор по умолчанию требуется при использовании оператора new matr[2], т.е. создинии массива объектов.
Оператор new вызывает функцию operator new(). Аргумент имя_типа используется для автоматического вычисления размера памяти sizeof(имя_типа), т.е. инструкция типа new имя_типа приводит к вызову функции:
operator new(sizeof(имя_типа));
Далее, в подразделе «Перегрузка операторов» будет рассмотрен случай использования доопределенного оператора new для некоторого класса. Доопределение оператора new позволяет расширить возможности выделения памяти для объектов (их компонент) данного класса.
Создание объекта с помощью операции new вызывает также выполнение конструктора для этого объекта. Если в new не указан список инициализации либо он пуст (только скобки), то выполняется конструктор по умолчанию (default), который будет рассмотрен ниже. Если имеется непустой список инициализации, то выполняется тот конструктор, для которого этот список соответствует списку аргументов.
При создании массива выполняется стандартный конструктор для каждого элемента.
Отметим преимущества использования оператора new перед использованием malloc():
- оператор new автоматически вычисляет размер необходимой памяти. Не требуется использование оператора sizeof(). При этом он предотвращает выделение неверного объема памяти;
- оператор new автоматически возвращает указатель требуемого типа (не требуется использование оператора преобразования типа);
- имеется возможность инициализации объекта;
- можно выполнить перегрузку оператора new (delete) глобально или по отношению к тому классу, в котором он используется.
Для разрушения объекта, созданного с помощью оператора new, необходимо использовать в программе оператор delete.
Оператор delete имеет две формы записи:
[::] delete переменная_указатель // для указателя на один элемент
[::] delete [] переменная_указатель // для указателя на массив
Единственный операнд в операторе delete должен быть указателем, возвращаемым оператором new. Если оператор delete применить к указателю, полученному не посредством оператора new, то результат будет непредсказуем.
Использование оператора delete вместо delete[] по отношению к указателю на массив может привести к логическим ошибкам. Таким образом, освобождать память, выделенную для массива, необходимо оператором delete [], а для отдельного элемента − оператором delete.
#include <iostream>
using mamespace std;