C++程序中哪些情况下变量会自动初始化
来源:互联网 发布:linux下创建用户群组 编辑:程序博客网 时间:2024/06/05 15:12
至今对于C++的初始化机制还存在一些疑虑,大致整理如下:
初始化的语法
我们首先来解决语法的问题。 C语言中在声明时用=
即可完成初始化操作。但我们偏向于使用C++风格(本文中均指面向对象程序设计风格)来初始化内置类型:
// C 风格int i = 3;int arr[] = {1, 2, 3};// C++ 风格int i(3);int i = int(3);int *p = new int(3);int[] arr = new int[]{1, 2, 3};在C语言中
int a;
表示声明了整型a
但未初始化,而C++中的对象总是会被初始化的,无论是否写了圆括号或者是否写了参数列表,例如:int basic_var; // 未初始化:应用"默认初始化"机制CPerson person; // 初始化:以空的参数列表调用构造函数
默认初始化规则
定义基本数据类型变量(单个值、数组)的同时可以指定初始值,如果未指定会默认初始化(default-initialization),什么是"默认初始化"呢?
- 栈中的变量(函数体中的自动变量)和堆中的变量(动态内存)会保有不确定的值;
- 全局变量和静态变量(包括局部静态变量)会初始化为零。
C++11: If no initializer is specified for an object, the object is default-initialized; if no initialization is performed, an object with automatic or dynamic storage duration has indeterminate value. Note: Objects with static or thread storage duration are zero-initialized, see 3.6.2.
所以函数体中的变量定义是这样的规则:
int i; // 不确定值int i = int(); // 0int i = new int; // 不确定值int i = new int(); // 0
静态和全局变量的初始化
未初始化的和初始化为零的静态/全局变量编译器是同样对待的,把它们存储在进程的BSS段(这是全零的一段内存空间)中。所以它们会被"默认初始化"为零。
关于进程的内存空间分配见进程的地址空间:TEXT,DATA,BSS,HEAP,STACK一文。
成员变量的初始化
成员变量分为成员对象和内置类型成员,其中成员对象总是会被初始化的。而我们要做的就是在构造函数中初始化其中的内置类型成员。 还是先来看看内置类型的成员的"默认初始化"行为。
内置类型的成员变量的"默认初始化"行为取决于所在对象的存储类型,而存储类型对应的默认初始化规则是不变的。 所以为了避免不确定的初值,通常会在构造函数中初始化所有内置类型的成员。Effective C++: Item 4一文讨论了如何正确地在构造函数中初始化数据成员。
封闭类嵌套成员的初始化
再来探讨一下当对象聚合发生时成员变量的"默认初始化"行为,同样还是只关注于基本数据类型的成员。
规则还是是一样的,默认初始化行为取决于它所属对象的存储类型。 封闭类中成员对象的内置类型成员变量的"默认初始化"行为取决于当前封闭类对象的存储类型,而存储类型对应的默认初始化规则仍然是不变的。
- C++程序中哪些情况下变量会自动初始化
- C++手稿:哪些变量会自动初始化?
- C程序中,变量的初始化问题
- 哪些情况下索引会失效?
- 哪些情况下索引会失效?
- 哪些情况下索引会失效
- 哪些情况下索引会失效?
- 哪些情况下索引会失效?
- 哪些情况下sql索引会失效
- 哪些情况下索引会失效?
- mysql哪些情况下索引会失效
- 哪些情况下sql索引会失效
- 哪些情况下索引会失效?
- 【C】为什么静态变量会被初始化为0,而自动变量却不会被初始化?
- 类什么情况下会执行初始化
- 黑马程序员:类中静态变量在加载类的过程中会自动初始化
- 【mysql】哪些情况下mysql索引会失效?
- C++:只用初始化列表初始化变量的几种情况
- linux虚拟机搭建
- JSP脚本和注释
- RESTful三理解
- 1007: C语言程序设计教程(第三版)课后习题5.5
- JSP的指令元素:page; include; taglib
- C++程序中哪些情况下变量会自动初始化
- 拥抱Android Studio:从ADT到Android Studio
- 自动化测试架构设计
- hdu1625 Numbering Paths (floyd判环)
- Vim实战指南(四):ex命令
- knockoutjs六 with 绑定
- [BZOJ3524] [Poi2014]Couriers/[BZOJ2223] [Coci 2009]PATULJCI
- QT实现自动打开网页
- 2分钟读懂大数据框架Hadoop和Spark的异同