文章目录
- 变量的自动初始化
- 1 全局变量、静态变量
- 2 栈上变量
- 3 堆上变量
- 内置基础类型
- 类类型
- 4 值初始化
变量的自动初始化
1 全局变量、静态变量
全局变量、静态变量会自动进行零初始化。
静态局部变量,是在第一次执行到定义处自动进行零初始化。
2 栈上变量
栈上的基础类型变量,不会进行初始化,拥有不可预测的值。
栈上的类对象的成员变量,如果是基础类型,不会进行初始化;如果是类类型,且有默认构造函数,则会自动调用默认构造函数。
3 堆上变量
内置基础类型
堆上的int、double等内置基础类型对象(使用 new 创建),不会进行初始化,拥有不可预测的值。(内存可能保留旧的垃圾值)
int * p = new int; // 分配堆内存,不做初始化,内存保留旧的垃圾值,拥有不可预测的值 int * p2 = new int(); // 零初始化,置0 int * p3 = new int{}; // 零初始化,置0类类型
在堆上的类对象(使用 new 创建),如果有默认构造函数,则会自动调用默认构造函数;
而类中的内置基础类型,如果在调用的构造函数中没有手动初始化,则依然不会被自动初始化,拥有不可预测的值;
类中的类类型成员,如果有默认构造函数,则会自动调用默认构造函数。
MyClass * my_class = new MyClass; // 分配堆内存,如果有默认构造函数,则调用4 值初始化
不管在栈上还是堆上,如果使用了空的初始化列表{}对类进行初始化,例如MyClass{},会将类的成员进行值初始化。
初始化列表{}触发值初始化,值初始化行为分两条分支(C++ 标准规则):
- 聚合类,即没有用户声明的默认构造函数的类。值初始化过程会将所有成员零初始化。
- 有用户自定义的默认构造函数(无论是否空实现)。值初始化会调用用户自定义的默认构造函数,不会自动帮你把内置成员清零,内置成员是什么值,完全看你的构造函数有没有手动赋值。