数组初始化
以前我这样初始化一个数组,并自我感觉良好:
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}; 等价
动态数组的初始化
说完了栈中的数组的初始化,我发现new一个数组和其又有一些不同:
上面几行代码遵循栈中数组的初始化规则,除此之外这里还有一个新语法:
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]();
注意后面的一对圆括号,它的意思是使用默认值初始化整个数组,所以对于类类型来说,new string[5] 与 new string[5]()是等价的,都会调用默认构造函数进行初始化;但是对于基本类型就不同了,new int[5]根本不会初始化,而new int[5]() 则会使用int()的值即0进行初始化。看到这对圆括号,我想它该不会是元素的构造函数的参数列表吧,那么我可能会想将数组全部初始化为1:new int[5](1); 看起来很合理,但其实不行。事实上这对圆括号不是数组元素的构造参数,可能是整个数组的,它有三个重载版本:
看起来像是常引用、右值引用、和默认版本。所以假如已经有一个相同大小的数组b,试着用b来初始化a:
int* a = new int[5](b);
结果编译出错,提示ERROR C3074: an array cannot be initialized with a parenthesized initializer,看来这个括号的作用和我想的不一样,其实也应该看出来的,要是是用另一个数组初始化的话那么参数应该是const int (&)[5] 而不是 const int [5] &,而且后者好像是一个错误的类型。这个问题暂时无解。错过了初始化时机(memset的误区)
如果想在数组创建结束后再对其进行初始化,可以使用C函数memset(),但是memset的使用有个大问题,就是它只对char类型的数组管用:
如果将上面的a数组换成int或其他类型的,就会出现问题,因为memset的内部实现是以字节为单位进行赋值的,int 类型大于一个字节(假设是4个),数组内存连续,如果有下面代码:
char a[10];
memset(a, 1, 10); // 将每个元素设置为1
将只会对前sizeof(a)即40个字节进行赋值1的操作,即给“前5个int”进行了赋值0x01010101的操作,失之毫厘谬以千里!
int a[10];
memset(a, 1, sizeof(a));
如果实在想再初始化,那么老老实实循环赋值吧。
转载自:https://blog.csdn.net/u014417133/article/details/77185009#commentBox相关阅读
一、有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂,比较少用。2.WinExec
使用C/C++编程时,常使用ZeroMemory、memset或 “={0}”来对结构体对象进行初始化或清零。然而这三种方式都有各自的特点,使用时需谨
[下载篇]VC++ 2010 Express 学生版 NCRE考试编译器
网盘下载地址[无密码] 2018年 NCRE考试 C++\C语言考试 改为 VC++ 2010 Express !!!!!!! 如果需要,请下载! 6VPJ7-H3CXH-HBTPT-X4T74-3YVY
算法原理 关于分水岭算法的介绍和原理,大家可以去看这篇博客,上面有很多动图,十分生动有趣:https://www.cnblogs.com/mikewolf2002/p/
介绍 STL(standard template library)标准模板库,是一种高效的C++程序库。STL分为三类:container(容器),iterator(迭代器)和algor