[C++]值初始化和默认初始化

在C++中,初始化方式多种多样,其中值初始化(value initialization)默认初始化(default initialization)是两种常见的初始化方式。它们之间的主要区别在于是否对变量赋初始值以及如何赋值。

1. 值初始化(Value Initialization)

值初始化指的是将变量明确地初始化为零或空值。不同类型的数据会根据其类型被赋予“零值”:

  • 数值类型(如intfloatdouble):初始化为0
  • 指针类型:初始化为nullptr
  • 用户自定义类类型:调用其默认构造函数(如果存在)。

值初始化常通过以下方式实现:

  • 使用空的大括号{}()初始化一个对象时:

  • 对于类类型,如果类没有用户定义的构造函数,则成员会进行值初始化。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
auto printer = [](int x, double y, int *p, A a, B b){
cout << "x = " << x << " "
<< "y = " << y << " " << endl
<< "p = " << p << " " << endl
<< "a.x = " << a.x << " a.y = " << a.y << " " << endl
<< "b.x = " << b.x << " b.y = " << b.y << endl;
};
// 值初始化
int x{}; double y{};
int *p{};
A a{}; B b{};
printer(x, y, p, a, b);
}

结果:

2. 默认初始化(Default Initialization)

默认初始化是指在变量定义时,如果没有显式地为其提供初始值,编译器会对它进行默认的处理。

  • 基本数据类型(如intfloat):不会进行任何初始化,可能包含未定义值(垃圾值)。
  • 指针类型:也是未定义的,指针没有被初始化到nullptr
  • 类类型:如果类定义了默认构造函数,那么对象将调用这个构造函数。

默认初始化常在以下情况下发生:

  • 通过不加括号或等号的方式声明对象:

  • 对于类类型,如果类有用户定义的默认构造函数,则会调用这个构造函数,否则,类成员将默认初始化。

在C++中,默认初始化和值初始化的行为可能在某些情况下看起来相同,但它们的底层机制却有所不同。你遇到的情况是,默认初始化和值初始化的结果相同,通常发生在以下几种场景下:

3. 全局变量和静态变量

在C++中,全局变量静态变量总是被零初始化,无论你是否显式地对它们进行初始化。这意味着即使你使用默认初始化,它们也会被初始化为零值。

示例:

1
2
3
4
5
6
int global_var;  // 全局变量,默认初始化为0

int main() {
static int static_var; // 静态局部变量,默认初始化为0
int local_var; // 局部变量,默认初始化,未定义(垃圾值)
}

在这种情况下,全局变量global_var和静态变量static_var即使没有显式地进行值初始化,默认初始化时也会被设置为0。这是C++标准规定的。


[C++]值初始化和默认初始化
https://erlsrnby04.github.io/2024/09/30/C-值初始化和默认初始化/
作者
ErlsrnBy04
发布于
2024年9月30日
许可协议