14

Jeśli coś takiego napisać:Jaki jest cel "{}" w "nowy int [5] {};"?

int *arr = new int[5]; 

W tym przypadku system dynamicznie przydziela miejsca dla 5 elementów typu int i zwraca wskaźnik do pierwszego elementu sekwencji.

Ale raz widziałem następujący kod:

int *arr = new int[5]{}; 

Więc, co ma oznaczać {} po new operatora? Jaki jest cel {} w tym kodzie?

Mam zainicjowany tablicę z własnej wartości, tak:

#include <iostream> 

int main() 
{ 
    int* a = new int[5]{1}; 
    for(int i = 0; i < 5; i++) 
     std::cout<< a[i]<<' '; 

    delete[] a; 
} 

wyjściowa:

1 0 0 0 0 

tylko pierwszy element print 1. Czemu?

+8

Zalecam, aby nie spieszyć się z czytaniem [tego "nowego" odniesienia] (http://en.cppreference.com/w/cpp/language/new). W tabeli opisującej składnię należy zwrócić uwagę na część * initializer *. Następnie przejdź do sekcji o [Budowa] (http://en.cppreference.com/w/cpp/language/new#Construction), aby dowiedzieć się więcej na ten temat. –

+1

Ta składnia jest używana od wersji C++ 11. Pozwala na zainicjowanie tablicy z wartościami podanymi w nawiasach klamrowych lub w tym przypadku zerami. –

+5

Użyj std :: vector! –

Odpowiedz

22
int *arr = new int[5]; 

wykonuje default initialization (co w tym przypadku oznacza, że ​​elementy arrniezainicjowanego), natomiast

int *arr = new int[5]{}; 

jest value initialization (co oznacza w tym przypadku elementy arrzerowego -initialized). Zobacz odpowiednie reguły w linkach. W szczególności w tym drugim przypadku tablica zostanie zainicjalizowana od zera.

W każdym razie, jeśli nie ma innego dobrego powodu, preferowane powinno być użycie std :: vector.

Edycja: Dotyczące drugiego pytania: Jest to spowodowane regułami inicjowania. Trzeba by napisać

int* a = new int[5]{1, 1, 1, 1, 1 }; 

Już zaleca std :: vector obsługuje składni pragnienie:

#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<int> a(5, 1); 
    for(int i = 0; i < 5; i++) 
     std::cout<< a[i]<<' '; 
} 

https://ideone.com/yhgyJg Uwaga jednak zastosowanie() -braces tutaj. Ponieważ wektor ma konstruktor dla std :: initializer_list, wektor wywołujący {5, 1} nałożyłby pewną niejednoznaczność, która jest rozwiązywana przez zawsze preferowanie konstruktora initializer_list dla {} -inicjalizacji, jeśli jest to przewidziane. Więc za pomocą {} spowodowałyby stworzyć wektor z 2 elementów wartości 5 i 1, a ponad 5 elementów wartości 1.

+0

Czy mogę zainicjować tablicę z własną wartością? – Jayesh

+0

Tak. Użyj np. inicjowanie listy dla poszczególnych wartości tablic: http://en.cppreference.com/w/cpp/language/list_initialization Edycja: Dla prawników językowych: Jest to w rzeczywistości inicjowanie agregacji, ponieważ tablice są agregatami. – Jodocus

+0

@Jayesh: Tak. Dowolne wyrażenie, czy to po prostu liczby, nazwy stałych, zmiennych, wyrażeń matematycznych lub wywołań funkcji, jest dozwolone na tej liście. – MSalters

0

Jeśli można odróżnić

int a[5]; 

i

int a[5] = {0}; 

, z których ostatnia jest częstą praktyką inicjowania lokalnej tablicy do wszystkie zero, można również port tej samej składni do new.

Oprócz roztworu std::vector, najbardziej bezpośredni (a masa) roztworu nie STL iteracja tablicy raz:

for (int i = 0; i < sizeof(a)/sizeof(int); i ++) 
    a[i] = 1; 

waszej informacji, za pomocą list przyczyn INITIALIZING wszystkie nieokreślone macierzy elementy do ustawienia na zero, np

int a[5] = {[1] = 3}; 
// Now a is {0, 3, 0, 0, 0}