Do závorky za názvem typu, aby se rozdíl s novým?

hlasů
875

Pokud ‚test‘ je obyčejná třída, je nějaký rozdíl mezi:

Test* test = new Test;

a

Test* test = new Test();
Položena 06/03/2009 v 20:39
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
849

Pojďme pedantský, protože existují rozdíly, které mohou skutečně ovlivnit chování Váš kód je. Hodně z následujících je převzat z připomínek k „Old New Thing“ článek .

Někdy se vrátila paměť novým operátorem se inicializuje, a někdy to nebude v závislosti na tom, zda jste typ newing up je POD (obyčejné data) , nebo pokud se jedná o třídu, která obsahuje členy POD a za použití kompilátor generované výchozí konstruktor.

  • V jazyce C ++ 1998 jsou k dispozici 2 druhy inicializace: nuly a výchozí
  • V jazyce C ++ 2003, byla přidána třetí typ inicializace inicializační hodnota.

Převzít:

struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m

V C ++ 98 kompilátor, by mělo dojít k následujícímu:

  • new A - neurčitý hodnota
  • new A() - zero-initialize

  • new B - výchozí konstrukt (B :: m je neinicializované)

  • new B() - výchozí konstrukt (B :: m je neinicializované)

  • new C - výchozí konstrukt (C :: m je nula inicializaci)

  • new C() - výchozí konstrukt (C :: m je nula inicializaci)

V C ++ 03 splňovalo požadavky kompilátor, vše by mělo fungovat jako tak:

  • new A - neurčitý hodnota
  • new A() - hodnota inicializovat, což je nula-inicializace, protože je to POD.

  • new B - default-inicializuje (listy B :: M neinicializovaný)

  • new B() - hodnota inicializuje B, která nulové inicializuje všechna pole, protože jeho výchozí ctor je kompilátor generována na rozdíl od uživatelsky definované.

  • new C - default-inicializuje C, který volá výchozí ctor.

  • new C() - hodnota inicializuje C, který volá výchozí ctor.

Tak ve všech verzích C ++ je tu rozdíl mezi new Ai new A()proto, že A je POD.

A tam je rozdíl v chování mezi C ++ 98 a C ++ 03 pro případ new B().

To je jeden z prašných koutech C ++, které mohou zbláznění. Při stavbě objektu, někdy budete chtít / potřebovat parens, někdy si absolutně nemůže mít, a někdy to nevadí.

Odpovězeno 06/03/2009 v 22:01
zdroj uživatelem

hlasů
48

new Thing();je výslovně uvedeno, že chcete, aby konstruktér volal, zatímco new Thing;je vzat znamenat, že vám to nevadí, pokud je konstruktor není volána.

Pokud se použije na struct / třídu s uživatelem definovaný konstruktor, není žádný rozdíl. Při volání na triviální struct / třídu (např struct Thing { int i; };), pak new Thing;je jako malloc(sizeof(Thing));že new Thing();je jako calloc(sizeof(Thing));- to bude nula inicializace.

Gotcha leží mezi nimi:

struct Thingy {
  ~Thingy(); // No-longer a trivial class
  virtual WaxOn();
  int i;
};

Chování new Thingy;vs new Thingy();v tomto případě měnit mezi C ++ 98 a C ++ 2003. Viz Michael Burr je vysvětlení, jak a proč.

Odpovězeno 15/02/2013 v 20:57
zdroj uživatelem

hlasů
16

No, oni jsou stejní. Ale je tu rozdíl mezi:

Test t;      // create a Test called t

a

Test t();   // declare a function called t which returns a Test

Je tomu tak proto základního C ++ (A a C) pravidlo: Je-li něco, co může být případně prohlášení, pak se jedná o prohlášení.

Edit: Re otázek týkajících se zahajovacími POD a non-Pod údaji, když jsem se vším, co bylo řečeno souhlasit, rád bych jen poukázat na to, že tyto otázky platí pouze v případě, že věc je new'd nebo jinak konstruovány nemá uživatelem definovaný konstruktor. Není-li takový konstruktor bude použit. Za 99,99% rozumně navržených tříd bude takový konstruktor, takže problémy mohou být ignorovány.

Odpovězeno 06/03/2009 v 20:42
zdroj uživatelem

hlasů
15

Obecně máme výchozí inicializaci v prvním případě a hodnotového inicializace v druhém případě.

Například: v případě, že se int (typ POD):

  • int* test = new int - Máme nějaké inicializaci a hodnotu * testu může být libovolná.

  • int* test = new int() - * Zkouška bude mít hodnotu 0.

další chování závisí od vašeho typu testu. Máme defferent případy: Test mají defult konstruktér, zkušební mají generované výchozí konstruktor, test obsahuje POD člen, které nejsou členy POD ...

Odpovězeno 06/03/2009 v 21:00
zdroj uživatelem

hlasů
10

Za předpokladu, že test je třída s definovaným konstruktoru není žádný rozdíl. Druhá forma dělá to trochu jasnější, že test je konstruktor běží, ale to je asi tak všechno.

Odpovězeno 06/03/2009 v 20:42
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more