так вот, вывод был что это ссылка на укзатель, но ведь по логике должен быть указатель на ссылку, хотя такое не может быть так как адрес ссылки есть адрес самого объекта.
Здравствуйте, Аноним, Вы писали:
А>Какая разница между
А>
А> A *ptr = new B();
А>
А>и А>
А> A *ptr = new B;
А>
Могу ошибаться, но вроде бы ничем не отличается.
А>И ещё вопрос:
А>
А>void func (int *&val);
А>
А>так вот, вывод был что это ссылка на укзатель, но ведь по логике должен быть указатель на ссылку, хотя такое не может быть так как адрес ссылки есть адрес самого объекта.
Все там правильно — именно ссылка на указатель. По аналогии смотрим
type& — это ссылка на объект некоторого типа, у тебя же в данном случае type = int*
В первом случае: выполняется value-initialization. Во втором случае: для не-POD класс типов выполняется default-initialization, а для остальных типов вообще никакой инициализации не делается.
Будет ли между этими варантами разница зависит от специфических свойств конкретного типа 'B'.
Если этот тип вообще не является класс-типом или является POD-класс-типом, то разница будет. В первом случае value-initialization сведется к обнулению, а во втором никакой инициализации не будет вообще.
Если это не-POD-класс-тип без явно объявленного конструктора, то в первом случае будет рекурсивно применена value-initialization к каждому подобъекту этого класса (что при этом получится — зависит о типов этих подобъектов), а в втором случае будет просто вызван неявно объявленный конструктор всего класса 'B' (что при этом получится — опять же зависит от типов подобъектов класса). В общем случае — будет разница.
Если же это класс-тип с явно объявленным конструктором, то в обоих случаях просто вызовется этот конструктор. Разницы не будет.
Т.е. без дополнитеьной информации о типе 'B' конкретного ответа на твой вопрос дать нельзя.
А>И ещё вопрос:
void func (int *&val);
А>так вот, вывод был что это ссылка на укзатель,
Да, это ссылка на указатель.
А>но ведь по логике должен быть указатель на ссылку,
Это по какой такой логике? В упор не вижу. К тому же в языке С++ не бывает указателей на ссылку.
А>хотя такое не может быть так как адрес ссылки есть адрес самого объекта.
Здравствуйте, Аноним, Вы писали:
А>Какая разница между
А>
А> A *ptr = new B();
А>
А>и А>
А> A *ptr = new B;
А>
5.3.4/15
A new expression that creates an object of type T initializes that object as follows:
— If the new initializer is omitted:
— If T is a (possibly cvqualified) non POD class type (or array thereof), the object is default initialized
(8.5) If T is a constqualified type, the underlying class type shall have a user-declared default constructor.
— Otherwise, the object created has indeterminate value. If T is a constqualified type, or a (possibly
cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of
const-qualified type, the program is illformed;
— If the new initializer is of the form (), defaultinitialization shall be performed (8.5);
Или, говоря русским языком: если B — не POD, то разницы нет — в обоих случаях будет вызван конструктор по умолчанию.
Если же B — это POD-тип, то в первом случае все его члены будут проинициализированы значениями по умолчанию, а во втором случае останутся непроинициализированными.
Например:
АТ>Будет ли между этими варантами разница зависит от специфических свойств конкретного типа 'B'.
АТ>Если этот тип вообще не является класс-типом или является POD-класс-типом, то разница будет. В первом случае value-initialization сведется к обнулению, а во втором никакой инициализации не будет вообще.
// Пример 1int* p1 = new int();
int* p2 = new int;
// '*p1' содержит 0, а '*p2' содержит непредсказуемое значение
// Пример 2struct 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' (что при этом получится — опять же зависит от типов подобъектов класса). В общем случае — будет разница.
// Пример 3struct S { int i; std::string s; };
S* p1 = new S();
S* p2 = new S;
// 'p1->i' содержит 0, а 'p2->i' содержит непредсказуемое значение
// Пример 4struct S { int i; private: int j; };
S* p1 = new S();
S* p2 = new S;
// 'p1->i' и 'p1->j' содержат 0, а соответствующие поля '*p2' содержат непредсказуемые значения
// Пример 5struct S { std::string s1, s2; };
S* p1 = new S();
S* p2 = new S;
// Разницы нет
АТ>Если же это класс-тип с явно объявленным конструктором, то в обоих случаях просто вызовется этот конструктор. Разницы не будет.
// Пример 6struct S { int i; std::string s; S(); };
S* p1 = new S();
S* p2 = new S;
// Разницы нет
B>5.3.4/15
B>A new expression that creates an object of type T initializes that object as follows:
B>— If the new initializer is omitted:
B> — If T is a (possibly cvqualified) non POD class type (or array thereof), the object is default initialized
B> (8.5) If T is a constqualified type, the underlying class type shall have a user-declared default constructor.
B> — Otherwise, the object created has indeterminate value. If T is a constqualified type, or a (possibly
B> cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of
B> const-qualified type, the program is illformed;
B>— If the new initializer is of the form (), defaultinitialization shall be performed (8.5);
B>
B>Или, говоря русским языком: если B — не POD, то разницы нет — в обоих случаях будет вызван конструктор по умолчанию. B>Если же B — это POD-тип, то в первом случае все его члены будут проинициализированы значениями по умолчанию, а во втором случае останутся непроинициализированными.
Несколько устарело. В современном стандартном С++ есть теперь value-initialization. Водораздел теперь проходит не по линии "POD или не-POD", а по линии "есть явный конструктор или нет его".
Здравствуйте, Аноним, Вы писали:
А>Какая разница между
А>
А> A *ptr = new B();
А>
А>и А>
А> A *ptr = new B;
А>
Для типов с конструктором — разницы никакой, в любюом случае он будет позван.
Для POD-типов — во втором случае объект будет не инициализированным.
А>И ещё вопрос:
А>
А>void func (int *&val);
А>
А>так вот, вывод был что это ссылка на укзатель, но ведь по логике должен быть указатель на ссылку, хотя такое не может быть так как адрес ссылки есть адрес самого объекта.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Аноним, Вы писали:
А>>Какая разница между
А>>
А>> A *ptr = new B();
А>>
А>>и А>>
А>> A *ptr = new B;
А>>
J>Для типов с конструктором — разницы никакой, в любюом случае он будет позван.
Тоже замечение, что и для Bell-а. Не забываем про value-initialization.
Best regards,
Андрей Тарасевич
Re[3]: A *ptr = new B();
От:
Аноним
Дата:
07.12.04 09:47
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:
теперь прояснилось, а то я тут начал разбираться с POD типом
и вот что я нашел:
POD тип — это тип, объекты которого можно безопасно перемещать в памяти (с помощью memmove(), например). Данному условию очевидно удовлетворяют встроенные типы (в том числе и указатели) и классы без определяемой пользователем операции присваивания и деструктора.
Кстати как насчёт классов с переопределённым оператором присваивания или деструктора?
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Несколько устарело. В современном стандартном С++ есть теперь value-initialization. Водораздел теперь проходит не по линии "POD или не-POD", а по линии "есть явный конструктор или нет его".
Здравствуйте, <Аноним>, Вы писали:
А>POD тип — это тип, объекты которого можно безопасно перемещать в памяти (с помощью memmove(), например). Данному условию очевидно удовлетворяют встроенные типы (в том числе и указатели) и классы без определяемой пользователем операции присваивания и деструктора.
3.9.10
Arithmetic types (3.9.1), enumeration types, pointer types, and pointer to member types (3.9.2), and cvqualified
versions of these types (3.9.3) are collectively called scalar types. Scalar types, POD-struct types,
POD-union types (clause 9), arrays of such types and cv-qualified versions of these types (3.9.3) are collectively
called POD types.
wrote:
> POD тип — это тип, объекты которого можно безопасно перемещать в памяти (с помощью memmove(), например). Данному условию очевидно удовлетворяют встроенные типы (в том числе и указатели) и классы без определяемой пользователем операции присваивания и деструктора.
// PODclass b
{
public:
int i;
};
// не PODclass a
{
public:
int i;
string s;
};
int main(int argc, char* argv[])
{
a a0;
a a01 = a();
b b0;
b b01 = b();
a* aa = new a;
a* aa2 = new a();
b* bb = new b;
b* bb2 = new b();
a aa3 = a();
a aa4 = a(aa3);
return 0;
}
Интовое поле инициализируется только в строках b* bb2 = new b(); и b b01 = b();
Получается, что автоматическая инициализация нулем есть только для полей POD-классов, при использовании value-initialization
Здравствуйте, MaximE, Вы писали:
>> POD тип — это тип, объекты которого можно безопасно перемещать в памяти (с помощью memmove(), например). Данному условию очевидно удовлетворяют встроенные типы (в том числе и указатели) и классы без определяемой пользователем операции присваивания и деструктора.
Там еще что-то (нет стандарта под рукой) было о нестатических полях, имеющих тип указателя на член класса. Могу ошибаться, но что-то такое помнится/думается. Ну и ссылки, само собой.
Re: Какая разница между new T и new T()
От:
Аноним
Дата:
03.08.09 20:04
Оценка:
Т>Если это не-POD-класс-тип без явно объявленного конструктора, то в первом случае будет рекурсивно применена value-initialization к каждому подобъекту этого класса (что при этом получится — зависит о типов этих подобъектов), а в втором случае будет просто вызван неявно объявленный конструктор всего класса 'B' (что при этом получится — опять же зависит от типов подобъектов класса). В общем случае — будет разница.
Можно место в стандарте где про это написано?
Re[2]: Какая разница между new T и new T()
От:
Аноним
Дата:
03.08.09 20:11
Оценка:
А>Можно место в стандарте где про это написано?
А, уже сам нашел.
Они там совсем офонарели в своем комитете. Умудряются усложнять то, что, казалось бы, уже некуда усложнять.