数组的定义和初始化
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。
相关文章推荐
- 备忘录模式
- 错误信息提示
- android 新特性material design 之recyclerview 详解
- Git配置SSH,并Push到GitHub上的相关流程
- Android 关闭多个Activity总结
- 虚函数
- 重学C++ (七) 类 概览
- android 汉字,拼音和英文返回大写首字母
- 混沌粒子群算法
- servlet/jsp GET/POST
- SAX解析XML
- iOS 一些技巧
- Method Swizzling
- Drawable装Bitmap,防止OOM
- FreeRtos heap1源码分析
- 测试工作中的 Mock 实现
- hdu2047
- Hdu 1070 MILK
- Java日志记录的5条规则
- jquery实现页面交互的几个小例子