14

如果我們寫出類似:「new int [5] {};」中的「{}」的用途是什麼?

int *arr = new int[5]; 

在這種情況下,系統動態地爲int類型的5個元素分配空間並返回一個指向該序列的第一個元素。

但是,一旦我看到下面的代碼:

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

那麼,是什麼意思{}new操作?這段代碼中{}的用途是什麼?

我已經初始化數組用我自己的價值,就像這樣:

#include <iostream> 

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

    delete[] a; 
} 

輸出:

1 0 0 0 0 

只有第一個元素打印1。爲什麼?

+8

我建議你花些時間閱讀[this'new' reference](http://en.cppreference.com/w/cpp/language/new)。在描述語法的表格中,請注意* initializer *部分。然後向下滾動到關於[施工](http://en.cppreference.com/w/cpp/language/new#Construction)的部分以瞭解更多信息。 –

+1

此語法自C++ 11以來一直在使用。它允許使用大括號內指定的值初始化數組,或者在此情況下使用零來初始化數組。 –

+5

使用std :: vector! – 2017-10-13 07:02:15

回答

22
int *arr = new int[5]; 

執行default initialization(在這種情況下意味着arr元素是未初始化),而

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

value initialization(在這種情況下意味着arr元素是零 - 初始化的)。請參閱鏈接中的相應規則。特別是對於後一種情況,數組將被初始化爲零。

無論如何,如果沒有其他好的理由,應該首選使用std :: vector。

編輯:關於你的第二個問題:這是由於初始化規則。你將不得不寫

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

已經推薦的std ::矢量支持你想要的語法:

#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 不過請注意使用()-braces這裏。由於vector有一個std :: initializer_list的構造函數,因此調用vector {5,1}會施加一定的歧義,通過始終優先考慮{} - 初始化的initializer_list構造函數(如果提供)來解決該問題。因此,使用{}會導致產生具有值5的2個元素和1,而不是值1

+0

我可以用我自己的值初始化一個數組嗎? – Jayesh

+0

@Jayesh:是的。任何表達式,無論是簡單的數字,命名常量,變量,數學表達式還是函數調用都可以在該列表中使用。 – MSalters

0

5層的元件的載體。如果你能告訴

int a[5]; 

int a[5] = {0}; 
之間的差

,後者是初始化本地數組到全部爲零的常見做法,您也可以將相同的語法移植到new。FYI

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

,使用列表初始化原因所有未指定的數組:

除了從std::vector溶液中,最簡單的(共同)非STL溶液通過陣列迭代一次元素被設置爲零,例如

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