2010-08-26 19 views
23

Gdy używam new [], aby utworzyć tablicę z moich klas:Czy nowy [] wywołuje domyślny konstruktor w C++?

int count = 10; 
A *arr = new A[count]; 

widzę, że wywołuje domyślny konstruktor Acount razy. W rezultacie arr ma count zainicjalizowane obiekty typu A. Ale jeśli mogę użyć tego samego skonstruować tablicę int:

int *arr2 = new int[count]; 

nie jest zainicjowany. Wszystkie wartości są podobne do -842150451, chociaż domyślny konstruktor int przypisuje jego wartość do 0.

Dlaczego tak różne zachowanie? Czy domyślny konstruktor nie jest wywoływany tylko dla typów wbudowanych?

+0

Możliwy duplikat [Jak mogę dokonać \ 'nowy \ [\] \' default-zainicjować tablicę prymitywnych typów?] (Https : //stackoverflow.com/questions/2468203/how-can-i-make-new-default-initialize-tray-of-primitive-types) – Suma

Odpowiedz

41

Zobacz the accepted answer na a very similar question. Podczas korzystania z new[] każdy element jest inicjowany przez domyślny konstruktor, z wyjątkiem sytuacji, gdy typ jest typem wbudowanym. Wbudowane typy są domyślnie zunifikalizowane.

mieć wbudowany typ tablicy domyślną zainicjowany użytku

new int[size](); 
+12

Wow, naprawdę nie wiedziałem, że możesz dodać nawiasy klamrowe do domyślnego inicjowania wbudowanych typów. Pracuję z C++ od lat. To jest ekscytujące lub bardzo smutne! – aardvarkk

3

Typy wbudowane nie mają domyślnego konstruktora, mimo że w niektórych przypadkach mogą otrzymać wartość domyślną.

Ale w twoim przypadku, new po prostu alokuje wystarczającą ilość miejsca w pamięci, aby przechowywać obiekty countint, tj. przydziela sizeof<int>*count.

+0

To nie jest prawdziwy konstruktor, ale sposób na ich zainicjowanie. .. –

+2

@rubber boots: 'int i();' nie inicjalizuje zmiennej o nazwie 'i'. Deklaruje funkcję "i" zwracającą int. Być może miałeś na myśli 'int i = int();' –

+1

@James: W C++ 0x możesz wreszcie powiedzieć co masz na myśli: 'int x {};' :) – fredoverflow

0

int nie jest klasą, jest wbudowanym typem danych, dlatego nie jest do tego wywoływany żaden konstruktor.

Powiązane problemy