您的位置:首页 > 其它

数组的定义和初始化

2016-01-22 16:55 239 查看

数组的定义和初始化

数组的维数必须用值大于等于 1 的常量表达式定义(第 2.7 节)。此常量表达式只能包含整型字面值常量、枚举常量(第 2.7 节)或者用常量表达式初始化的整型 const 对象。非 const 变量以及要到运行阶段才知道其值的 const变量都不能用于定义数组的维数。

1.显式初始化数组元素

const unsigned array_size = 3;
int ia[array_size] = {0, 1, 2};


2.如果没有显式提供元素初值,则数组元素会像普通变量一样初始化(第 2.3.4节):

• 在函数体外定义的内置数组,其元素均初始化为 0。

• 在函数体内定义的内置数组,其元素无初始化。

• 不管数组在哪里定义,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化;如果该类没有默认构造函数,则必须为该数组的元素提供显式初始化。

除非显式地提供元素初值,否则内置类型的局部数组的元素没有初始化。此时,除了给元素赋值外,其他使用这些元素的操作没有定义。

3.显式初始化的数组不需要指定数组的维数值,编译器会根据列出的元素个数来确定数组的长度:

int ia[] = {0, 1, 2}; // an array of dimension 3

如果指定了数组维数,那么初始化列表提供的元素个数不能超过维数值。如果维数大于列出的元素初值个数,则只初始化前面的数组元素;剩下的其他元素,若是内置类型则初始化为0,若是类类型则调用该类的默认构造函数进行初始化:

const unsigned array_size = 5;
// Equivalent to ia = {0, 1, 2, 0, 0}
// ia[3] and ia[4] default initialized to 0
int ia[array_size] = {0, 1, 2};
// Equivalent to str_arr = {"hi", "bye", "", "", ""}
// str_arr[2] through str_arr[4] default initialized to the
empty string
string str_arr[array_size] = {"hi", "bye"};


4.字符数组初始化

字符数组既可以用一组由花括号括起来、逗号隔开的字符字面值进行初始化,也可以用一个字符串字面值进行初始化。

char ca1[] = {'C', '+', '+'}; // no null
char ca2[] = {'C', '+', '+', '\0'}; // explicit null
char ca3[] = "C++"; // null terminator added automatically


5.动态数组初始化

动态分配数组时,如果数组元素具有类类型,将使用该类的默认构造函数(第2.3.4 节)实现初始化;如果数组元素是内置类型,则无初始化:

string *psa = new string[10]; // array of 10 empty strings
int *pia = new int[10]; // array of 10 uninitialized ints


也可使用跟在数组长度后面的一对空圆括号,对数组元素做值初始化(第

3.3.1 节):

int *pia2 = new int[10] (); // array of 10 uninitialized ints


圆括号要求编译器对数组做值初始化,在本例中即把数组元素都设置为0。

对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的初值。

如果我们在自由存储区中创建的数组存储了内置类型的 const 对象,则必须为这个数组提供初始化:因为数组元素都是 const 对象,无法赋值。实现这个要求的唯一方法是对数组做值初始化:

// error: uninitialized const array
const int *pci_bad = new const int[100];
// ok: value-initialized const array
const int *pci_ok = new const int[100]();
C++ 允许定义类类型的 const 数组,但该类类


型必须提供默认构造函数:

// ok: array of 100 empty strings
const string *pcs = new const string[100];


在这里,将使用 string 类的默认构造函数初始化数组元素。

6.多维数组的初始化

int ia[3][4] = { /* 3 elements, each element is an array of size 4 */
{0, 1, 2, 3} , /* initializers for row indexed by 0 */
{4, 5, 6, 7} , /* initializers for row indexed by 1 */
{8, 9, 10, 11} /* initializers for row indexed by 2 */
};


其中用来标志每一行的内嵌的花括号是可选的。下面的初始化尽管有点不清楚,但与前面的声明完全等价:

int ia[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};


下面的声明只初始化了每行的第一个元素:

// explicitly initialize only element 0 in each row
int ia[3][4] = {{ 0 } , { 4 } , { 8 } };


其余元素根据其元素类型用第 4.1.1 节描述的规则初始化。

如果省略内嵌的花括号,结果会完全不同:

// explicitly initialize row 0
int ia[3][4] = {0, 3, 6, 9};


该声明初始化了第一行的元素,其余元素都被初始化为 0。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: