C++中的数组初始化

8
#include <iostream>
using namespace std;

int main() {
    int arr[10] = {};
    for(auto element : arr)
    {
        cout<<element<<" ";
    }
    cout<<endl;
}

如果我写 int arr[10] = {},那么arr中的元素都是0。但如果我只写int arr[10],那么arr中的元素就是随机的。所以我对int arr[10] = {}感到困惑,因为我只声明了一个数组int arr[10],但我没有给它任何值,只有一个{}

这只是一种语法糖,在许多情况下,您需要创建一个用零初始化的整数数组。想象一下,如果数组大小为1000,那么除了使用这种语法之外,唯一的方法就是循环遍历数组并手动将0赋值给每个元素。在此处阅读有关数组的更多信息:http://www.cplusplus.com/doc/tutorial/arrays/ - tchelidze
既然你已经有了答案,为了好玩,去掉 =(但是保留 {})再试一次。int arr[10]{}; - WhozCraig
@WhozCraig 结果是 0 0 0 0 0 0 0 0 0 0= 可能是无用的,原因是什么? - BlackMamba
这会破坏乐趣。当你有空闲时间时,在SO上进行一些搜索,寻找更多关于不同初始化方法的相关C++问题。感谢你的尝试。 - WhozCraig
3个回答

7
如果我写int arr[10] = {},arr中的元素都是0。这就是语言语法的工作方式。在你的案例中,数组将被初始化为零。
但如果我只写int arr[10],那么arr中的元素就是随机的。在这种情况下,数组元素没有被初始化。您不应该读取未初始化的变量的值;否则会触发未定义行为。

3
实际上,int arr[10] = {}; 会进行 值初始化。而 int arr[10]; 则是 默认初始化,对于 int 类型不会执行任何操作。(参考 [dcl.init/7]) - M.M
它只适用于基本类型(int,float,double)吗?如果我定义一个自定义类Person,那么Person arr [10] = {}是否有效? - BlackMamba
@BlackMamba 在这种情况下,您的对象实例将被默认初始化 - 就我所知,这意味着对于您的类来说是什么默认初始化。 - Giorgi Moniava
@Giorgi 更准确地说,它们也将被值初始化。这在某些情况下可能会有所不同。 - juanchopanza
@BlackMamba 如果 Person 有构造函数,则 默认初始化 意味着调用该构造函数来初始化 Person - M.M

2

0

int arr[10];并没有初始化任何值,它只是分配内存块大小的int,你将得到该内存中存在的任何值。

int arr[10] = {};会将所有的int块初始化为null / 0。


对于内置类型(如int),这是正确的,但对于具有构造函数的类型来说,默认初始化和值初始化之间的差异更加复杂。 - Martin Bonner supports Monica
1
@MartinBonner但是他在示例中使用了int数组,并问为什么会得到所有0或随机数据。我有什么遗漏吗?我明白你的意思,但不认为它适用于这个问题。object arr[10] = {}会使用该对象的默认构造函数吗? - lciamp
1
如果存在默认构造函数,则object arr[10] = {};object arr[10];都将调用它。如果它是POD类型,则在第一种情况下每个对象都将被零初始化,在第二种情况下则保持不确定状态。 - Martin Bonner supports Monica
将 int 块初始化为 null? - xaxxon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接