Re[2]: A *ptr = new B();
От: Андрей Тарасевич Беларусь  
Дата: 07.12.04 09:30
Оценка: 8 (3)
Например:

АТ>Будет ли между этими варантами разница зависит от специфических свойств конкретного типа 'B'.


АТ>Если этот тип вообще не является класс-типом или является POD-класс-типом, то разница будет. В первом случае value-initialization сведется к обнулению, а во втором никакой инициализации не будет вообще.


// Пример 1

int* p1 = new int();
int* p2 = new int;
// '*p1' содержит 0, а '*p2' содержит непредсказуемое значение

// Пример 2

struct R { double x, y; };
struct S { int i; R r; };

S* p1 = new S();
S* p2 = new S;
// 'p1->i', 'p1->r.x' и 'p1->r.y' содержат 0, а соответствующие поля '*p2' содержат непредсказуемые значения


АТ>Если это не-POD-класс-тип без явно объявленного конструктора, то в первом случае будет рекурсивно применена value-initialization к каждому подобъекту этого класса (что при этом получится — зависит о типов этих подобъектов), а в втором случае будет просто вызван неявно объявленный конструктор всего класса 'B' (что при этом получится — опять же зависит от типов подобъектов класса). В общем случае — будет разница.


// Пример 3

struct S { int i; std::string s; };

S* p1 = new S();
S* p2 = new S;
// 'p1->i' содержит 0, а 'p2->i' содержит непредсказуемое значение


// Пример 4

struct S { int i; private: int j; };

S* p1 = new S();
S* p2 = new S;
// 'p1->i' и 'p1->j' содержат 0, а соответствующие поля '*p2' содержат непредсказуемые значения


// Пример 5

struct S { std::string s1, s2; };

S* p1 = new S();
S* p2 = new S;
// Разницы нет


АТ>Если же это класс-тип с явно объявленным конструктором, то в обоих случаях просто вызовется этот конструктор. Разницы не будет.



// Пример 6

struct S { int i; std::string s; S(); };

S* p1 = new S();
S* p2 = new S;
// Разницы нет
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.