[关闭]
@CrazyHenry 2018-01-23T20:07:26.000000Z 字数 1398 阅读 1433

2.x 关于内置类型的默认初始化

ccccC++Primer


执行默认初始化时,内置类型的值是未定义的.这句话是有前提的,前提是什么,前提就是这个内置类型在哪申请的空间。

  1. int a;//默认初始化,在静态存储区申请,所以初始化为0
  2. int a_1=3;//这个叫做显式初始化,3作为初始值,vector会给对象值初始化
  3. int main()
  4. {
  5. int k=5;//这个叫做有初始值,显式初始化
  6. k=8;//这个不是初始化,叫赋值
  7. vector<int> ivec(10);//值初始化为10个0
  8. int b;//b也是内置类型,但是他在函数体申请,所以是在栈申请的空间,所以值未定义
  9. int *p=new int;//new出来的空间都是在堆申请的,有操作系统自动分配可用空间,所以不会初始化
  10. static int c;//static申明的成员是存储在静态存储空间的,所以会初始化为0,值初始化
  11. return 0;
  12. }

不论你现在能不能看懂,如果以后能懂了,也可以回来看下,我给你做简单的分类:

理解

默认初始化有两种:针对内置类型的,针对类类型的
针对内置类型(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个元素都赋初值为空。
??值初始化感觉也是一个构造函数。

类类型的默认初始化,即调用默认构造函数,一定要保证不产生未定义的变量;也就是说,类类型我们一般无需担心默认初始化的问题。唯一需要担心的地方就是内置类型,因为内置类型在函数体内实际上就不会初始化。除非是创建在静态区的内置类型,否则,都没有初始化。

在堆区和栈区的没有显式声明的内置类型"默认初始化"实际上就是不初始化

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注