2009-10-17 4 views
21

w C++, jaka jest dokładna różnica między obu następujących obiektów dynamicznych kreacji:Różnica między A * pA = new A; i A * pA = nowy A();

A* pA = new A; 

A* pA = new A(); 

Zrobiłem kilka testów, ale wydaje się, że w obu przypadkach, domyślny konstruktor nazywa i tylko to. Szukam jakiejkolwiek różnicy o wydajności ...

Dzięki

Odpowiedz

38

Jeśli A jest typu POD, a następnie new A przydzieli nowy A obiektu, ale pozostawić ją z wartością nieokreślony, inaczej new A będzie domyślny zainicjować nowy obiekt.

We wszystkich przypadkach new A() będzie wartość zainicjować nowy obiekt A.

Jest to oczywiście inne zachowanie dla typów POD, ale ma również wpływ na typy inne niż POD, niezwiązane z klasami związków bez deklaracji używanego konstruktora.

E.g.

struct A 
{ 
    int a; 
    std::string s; 
}; 

A jest klasą inną niż POD bez konstruktora deklarowanego przez użytkownika. Kiedy A jest domyślnie zainicjowany domyślnie zdefiniowany konstruktor jest wywoływany, który wywołuje domyślny konstruktor dla s (typ inny niż POD), ale a nie został zainicjowany.

Gdy A jest wartość zainicjowany, gdyż nie ma używanych zadeklarowany konstruktor, wszyscy jej członkowie są wartość zainicjowany co oznacza, że ​​konstruktor domyślny dla s nazywa i a jest zerowy zainicjowany.

ISO 14882: 2003 odnośników:

  • 5.3.4 [expr.new]/15: Jak obiekty przydzielone przez wyrażenie new są inicjowane w zależności od tego, czy inicjator jest pomijany, parę nawiasów lub Inaczej.

  • 8,5 [dcl.init]/5: sens zera zainicjować, domyślny zainicjować i wartości inicjalizacji.

  • 12.1 [class.ctor]/7,8: Formularz konstruktora napisanego przez użytkownika, który pasuje do zachowania niejawnie zdefiniowanego domyślnego konstruktora.

  • 12.6.2 [class.base.init]/4: W jaki sposób inicjowane są bazy i elementy, które nie są wymienione na liście inicjalizatora elementu konstruktora.

+0

To się zgadza. –

+0

hmmm, jakieś referencje? – hasen

+2

, a sformułowanie jest rzeczywiście mylące. Czym do cholery jest POD? – hasen

0

To jest dokładnie to samo, również wydajność mądry :)

+2

To po prostu nieprawda. Te dwa wyrażenia mają różne skutki dla typów POD i typów bez POD bez konstruktorów zdefiniowanych przez użytkownika. –

+0

Charles Bailey ma rację. –

+2

Co to jest "POD"? – hasen

0

lexer będzie musiał zeskanować dwa znaki mniej w pierwszej wersji, więc proces kompilacji jest trochę szybciej;)

+3

... i mają inną semantykę. –

-1

proszę zobaczyć kod implementujący STL (np. Alokator), wtedy zrozumiesz.

Powiązane problemy