标签:和我 数列 blog class 单位 十分 nbsp net 全局
数组初始化列表中的元素个数小于指定的数组长度时,不足的元素补以默认值。
以前我这样初始化一个数组,并自我感觉良好:
int a[5] = { 0 }; // 全部初始化为0
这种简单的写法让我非常爽,于是我又想把数组全部初始化为1:
int a[5] = { 1 }; // 我想全部初始化为1
直到十分钟前,我都以为这句代码确实能够将5个元素全部初始化为1,但事实跟我想的完全不同!(基础的东西革命的本钱,疏漏不得啊)
全部初始化为0的那行代码确实是没问题的,可以正常工作。问题就出在想把数组全部初始化成一个非0的数,即非默认值,是行不通的(查看内存发现,只有数组的第一个元素被初始化为1,其他全为0)。这倒不是因为编译器对初始化为0给了个后门,而是因为一条基本语法规则:
数组初始化列表中的元素个数小于指定的数组长度时,不足的元素补以默认值。
对于基本类型int来说,当然就是补int()即0了。再看一下非基本类型的数组:
string a[5] = { "foo" };
有了上面的规则,就很容易知道其实相当于:
string a[5] = { "foo", "", "", "", "" };
即后面4个元素调用了string的默认构造函数进行的初始化,而第一个则调用的string::string(const char*)进行的初始化。
还有一个区别:
int a[5]; string a[5];
如果不明确指出初始化列表,那么基本类型是不会被初始化的(除全局变量和静态变量外),所有的内存都是“脏的”;而类类型则会为每个元素调用默认构造函数进行初始化。
注意,在C++11中中间的赋值号可以省略,即 int a[5]{1}; 并且,如果初始化列表为空,如 int a[5]{};,那将初始化所有元素为默认值,即与 int a[5]{0}; 等价
int* a = new int[5]; string* a = new string[5]; int* a = new int[5] { 0 }; string* a = new string[5] { "foo" };
int* a = new int[5]();
int* a = new int[5](b);
char a[10]; memset(a, 1, 10); // 将每个元素设置为1
int a[10]; memset(a, 1, sizeof(a));
标签:和我 数列 blog class 单位 十分 nbsp net 全局
原文地址:https://www.cnblogs.com/2018shawn/p/9472506.html