Рассмотрим следующий класс с пользовательским ctor по умолчанию.
class TestClass {
public:
TestClass()
:data_(999) {
}
double getData() const {
return data_;
}
private:
double data_;
};
Затем мы создаем объекты:
TestClass *p2 = new TestClass();
TestClass *p1 = new TestClass;
Какая разница для использования 2 операторов выше в любых условиях?
Спасибо,
Краткий ответ: без разницы.
Более длинный ответ: §5.3.4,15 гласит, что
новое выражение который создает объект типа
T
инициализирует этот объект следующим образом:
— Если новый инициализатор опущен, объект по умолчанию инициализируется (§8.5); если инициализация не выполняется, объект имеет неопределенное значение.
— В противном случае новый инициализатор интерпретируется в соответствии с правилами инициализации §8.5 для прямой инициализации.
И §8.5,16 говорит
Если инициализатор (), объект Значение инициализирован.
Теперь, что такое инициализация значения и инициализация по умолчанию, определяется в §8.5,5-7:
к нулевой инициализации объект или ссылка типа T означает:
— если T скалярный тип (3.9), объекту присваивается значение 0 (ноль), […]
— если T является (возможно, cv-квалифицированным) типом несоединения классов, каждый элемент нестатических данных и каждый подобъект базового класса инициализируются нулями, а заполнение инициализируется нулевыми битами;
— если T является (возможно, cv-квалифицированным) типом объединения, первый нестатический именованный элемент данных объекта инициализируется нулями, а заполнение инициализируется нулевыми битами;
— если T является типом массива, каждый элемент инициализируется нулями;
— если T является ссылочным типом, инициализация не выполняется.к по умолчанию инициализирует объект типа T означает:
— если T является (возможно, cv-квалифицированным) типом класса (раздел 9), конструктор по умолчанию для T называется […]
— если T является типом массива, каждый элемент инициализируется по умолчанию;
— в противном случае инициализация не выполняется.
[…]к Значение инициализации объект типа T означает:
— если T является (возможно, cv-квалифицированным) типом класса (раздел 9) с предоставленным пользователем конструктором (12.1), тогда конструктор по умолчанию для T называется […]
— если T является (возможно, cv-квалифицированным) типом класса, не являющимся объединением, без предоставленного пользователем конструктора, то объект инициализируется нулями и, если неявно объявленный конструктор T по умолчанию является нетривиальным, вызывается этот конструктор.
— если T является типом массива, то каждый элемент инициализируется значением;
— в противном случае объект инициализируется нулями.
(акцент мой)
Вместе, поскольку ваш класс имеет предоставленный пользователем конструктор по умолчанию, инициализация значения и инициализация по умолчанию одинаковы, поэтому оба новых выражения имеют одинаковое поведение, а именно вызывается конструктор по умолчанию.
Это другое дело, например, Интс:
int *p2 = new int(); // value-initialized, i.e. zero-initialized, *p2 is 0
int *p1 = new int; // default-initialized, i.e. no initialization. *p1 is some garbage. Or whatever.
Других решений пока нет …