C++陣列的初始化規則
C++有幾條關於初始化陣列的規則,它們限制了初始化的時刻,決定了陣列的元素數目與初始化器中值的數目不相同時將發生的情況。
只有在定義陣列時才能使用初始化,此後就不能使用了,也不能將一個數組賦給另一個數組:
int cards[4] = {3, 6, 8, 10}; //okay
int hand [4]; //okay
hand[4] = {5, 6, 7, 9}; //not allowed
hand = cards; //not allowed
然而,可以使用下標分別給陣列中的元素賦值。
初始化十足十,提供的值可以少於陣列的元素數目。例如,下面的語句值初始化hotelTips的前兩個元素:
float hotelTips[5] = {5.0, 2.5};
如果只對陣列的一部分進行初始化,則編譯器將把其他元素設定為0。因此,將陣列中所有的元素都初始化為0非常簡單——只要顯示的將第一個元素初始化為0,然後讓編譯器將其他元素都初始化為0即可:
long total[500] = {0};
如果初始化為{1}而不是{0},則第一個元素被設定為1,其他元素都被設定為0。
如果初始化陣列時方括號([ ])為空,C++編譯器將計算元素個數。例如,對於下面的宣告:
short things[] = {1, 5, 3, 8};
編譯器將使things陣列包含4個元素。
讓編譯器去做
通常,讓編譯器計算元素個數是種很糟的做法,因為其計數可能與您想象的不一樣。例如,您可能不小心在列表中遺漏了一個值。然而,這種方法對於將字元陣列初始化為一個字串來說比較安全,很快你將明白這一點。如果主要關心的問題時程式,而不是自己是否知道陣列的大小,則可以這樣做:
short things[] = {1, 5, 3, 8};
int num_elements = sizeofthings / sizeof (short);
這樣做是有用還是偷懶取決於具體情況。
C++11陣列的初始化方法
首先,初始化陣列時,可省略(=)
double earning[4] {1.2e4, 1.6e4, 1.1e4, 1.7e4}; //okay with C++11
其次,可不在大括號內包含任何東西,這將把所有元素都設定為零:
unsigned int counts[10] = {}; // all elements set to 0
float balances[100] {}; //all elements set to 0
第三,列表初始化禁止縮窄轉換:
long plifs[] = {25, 92, 3.0}; //not allowed
char slifs[4] {'h', 'i', 1122011, '\0'}; // not allowed
char tlifs[4] {'h', ' i', 112, '\0'};
在上述程式碼中,第一條語句不能通過編譯,因為浮點數轉換為整型是縮窄操作,即使浮點的小數點後面為0。第二條語句也不能通過編譯,因為1122011超出了char變數的取值範圍(這裡假設char變數的長度為8位)。第三條語句可通過編譯,因為雖然112是一個int值,但它在char變數的取值內。
C++標準模板庫(STL)提供了一種陣列代替品——模板類vector,而C++11新增了模板類array。這些替代品比內建複合型別陣列更復雜,更靈活。