@CrazyHenry
2018-01-23T20:07:26.000000Z
字数 1398
阅读 1433
ccccC++Primer
- Author:李英民 | Henry
- E-mail: li
_
yingmin@
outlookdot
com- Home: https://liyingmin.wixsite.com/henry
快速了解我: About Me
转载请保留上述引用内容,谢谢配合!
执行默认初始化时,内置类型的值是未定义的.这句话是有前提的,前提是什么,前提就是这个内置类型在哪申请的空间。
int a;//默认初始化,在静态存储区申请,所以初始化为0
int a_1=3;//这个叫做显式初始化,3作为初始值,vector会给对象值初始化
int main()
{
int k=5;//这个叫做有初始值,显式初始化
k=8;//这个不是初始化,叫赋值
vector<int> ivec(10);//值初始化为10个0
int b;//b也是内置类型,但是他在函数体申请,所以是在栈申请的空间,所以值未定义
int *p=new int;//new出来的空间都是在堆申请的,有操作系统自动分配可用空间,所以不会初始化
static int c;//static申明的成员是存储在静态存储空间的,所以会初始化为0,值初始化
return 0;
}
不论你现在能不能看懂,如果以后能懂了,也可以回来看下,我给你做简单的分类:
默认初始化有两种:针对内置类型的,针对类类型的
针对内置类型(int,char):在任何函数体外的(默认初始化为0),在函数体内的(包括main函数,不被初始化,未定义)
针对类类型(string,Sales_data):默认初始化就是调用默认构造函数(包括类内初始值,initialize list)
值初始化,到目前为止,只有vector以及static变量说到
值初始化,就是一定会拿一些初始值,来对变量进行初始化,也许是从默认构造函数那里拿的,也许是自己创建的。比如,static int a;
这就是自己创建了一个0,赋初值给a;vector<int> ivec(10);
这里也是自己创建了10个0,赋初值给ivec;vector<string> vstr(10);
这里就是从string的默认构造函数(默认初始化)那里,将vstr的10个元素都赋初值为空。
??值初始化感觉也是一个构造函数。
类类型的默认初始化,即调用默认构造函数,一定要保证不产生未定义的变量;也就是说,类类型我们一般无需担心默认初始化的问题。唯一需要担心的地方就是内置类型,因为内置类型在函数体内实际上就不会初始化。除非是创建在静态区的内置类型,否则,都没有初始化。
在堆区和栈区的没有显式声明的内置类型,"默认初始化"实际上就是不初始化。