В С++ существует несколько правил, касающихся инициализации массивов. Они ограничивают, когда можно ее осуществлять и определяют, что случится, если количество элементов массива не соответствует количеству элементов инициализатора.
Использовать инициализацию можно ТОЛЬКО при объявлении массива.
Ее нельзя выполнить позже и нельзя присваивать один массив другому:
int card[4] = {3, 6, 8, 10}; // разрешено
int hand[4]; //разрешено
hand[4] = {5, 8, 3, 9}; //не допускается
hand = card; //не допускается
Но, можно использовать индексы и присваивать значения элементам массива индивидуально. При инициализации массива можно указывать меньше значений, чем в массиве объявлено элементов.
Например, float hotelTips[5] = {5.0, 2.5};
Если инициализировать массив частично, то компилятор присваивает остальным элементам нулевые значения. Это значит, что инициализировать весь массив нулями очень легко – для этого достаточно явно инициализировать нулем его первый элемент:
long totals[500] = {0};
Если инициализировать массив таким же образом, но с применением 1, вместо 0, только первый элемент будет установлен в 1, а остальные по-прежнему получат значение 0.
Если при инициализации массива оставить квадратные скобки пустыми, то компилятор самостоятельно пересчитает элементы. Предположим, например, что есть следующее объявление:
short totals[] ={1, 8, 4, 2};
Компилятор сделает totals массивом из пяти элементов.
В С++11 форма инициализации с фигурными скобками (списковая инициализация) стала универсальной для всех типов. Массивы уже используют списковую инициализацию, но в версии с++11 появились дополнительные возможности.
1. При инициализации массива можно отбросить знак =.
double earn[4] {1.3e5, 1.6e3, 1.1e4, 1.7e4};
2. Можно использовать пустые фигурные скобки для установки всех элементов в 0.
unsigned int counts[10] = {}; // все элементы устанавливаются в 0
float balances[100] {}; // все элементы устанавливаются в 0
3. Списковая инициализация защищает от сужения.
long plifs[] = {25, 92, 3.0}; // не разрешено
char slifs[4] = {‘h’, ‘u’, 1122011, ‘\0’}; // не разрешено
1)Преобразование из типа с плавающей точкой в целочисленный тип является сужением, даже если значение с плавающей точкой содержит после десятичной точки только нули.
2)1122011 выходит за пределы диапазона значений типа char, предполагая, что char занимает 8 бит.
3)Выполняется успешно, несмотря на то, что 112 значение int, но оно находится в рамках диапазона типа char.
Программа 1.Массивы целых чисел.
// arrayone.cpp -- small arrays of integers
#include <iostream>
int main()
{
using namespace std;
int apple[3]; // creates array with three elements
apple[0] = 7; // assign value to first element
apple[1] = 8;
apple[2] = 6;
int applecosts[3] = {20, 30, 5}; // create, initialize array
cout << "Total apple = ";
cout << apple[0] + apple[1] + apple[2] << endl;
cout << "The package with " << apple[1] << " apple costs ";
cout << applecosts[1] << " cents per apple.\n";
int total = apple[0] * applecosts[0] + apple[1] * applecosts[1];
total = total + apple[2] * applecosts[2];
cout << "The total apple expense is " << total << " cents.\n";