[C++]值初始化和默认初始化
在C++中,初始化方式多种多样,其中值初始化(value initialization)和默认初始化(default initialization)是两种常见的初始化方式。它们之间的主要区别在于是否对变量赋初始值以及如何赋值。
1. 值初始化(Value Initialization)
值初始化指的是将变量明确地初始化为零或空值。不同类型的数据会根据其类型被赋予“零值”:
- 数值类型(如
int
、float
、double
):初始化为0
。 - 指针类型:初始化为
nullptr
。 - 用户自定义类类型:调用其默认构造函数(如果存在)。
值初始化常通过以下方式实现:
使用空的大括号
{}
或()
初始化一个对象时:对于类类型,如果类没有用户定义的构造函数,则成员会进行值初始化。
示例:
1 |
|
结果:
2. 默认初始化(Default Initialization)
默认初始化是指在变量定义时,如果没有显式地为其提供初始值,编译器会对它进行默认的处理。
- 基本数据类型(如
int
、float
):不会进行任何初始化,可能包含未定义值(垃圾值)。 - 指针类型:也是未定义的,指针没有被初始化到
nullptr
。 - 类类型:如果类定义了默认构造函数,那么对象将调用这个构造函数。
默认初始化常在以下情况下发生:
通过不加括号或等号的方式声明对象:
对于类类型,如果类有用户定义的默认构造函数,则会调用这个构造函数,否则,类成员将默认初始化。
在C++中,默认初始化和值初始化的行为可能在某些情况下看起来相同,但它们的底层机制却有所不同。你遇到的情况是,默认初始化和值初始化的结果相同,通常发生在以下几种场景下:
3. 全局变量和静态变量
在C++中,全局变量和静态变量总是被零初始化,无论你是否显式地对它们进行初始化。这意味着即使你使用默认初始化,它们也会被初始化为零值。
示例:
1 |
|
在这种情况下,全局变量global_var
和静态变量static_var
即使没有显式地进行值初始化,默认初始化时也会被设置为0。这是C++标准规定的。
[C++]值初始化和默认初始化
https://erlsrnby04.github.io/2024/09/30/C-值初始化和默认初始化/