c++:总是优先于值初始化而不是默认初始化?



如果我理解正确,值初始化T obj {};使用自定义构造函数,而默认初始化T obj;要么使用自定义构造函数,要么不初始化obj(即未定义)。

由于未初始化的值通常是糟糕的风格,我们是否应该总是更喜欢值初始化而不是默认初始化?是否存在默认初始化实际上比值初始化更好的场景?

T obj;要么使用用户定义的构造函数,要么不初始化obj(即未定义)。

obj在本例中是初始化的。此外,类类型的所有非静态成员也是默认初始化的,只有内置类型的非静态成员(指针、intchar等)具有不确定的值。这意味着无论如何都要为这些成员分配所需的内存,但没有额外的努力将它们设置为任何特定的值(我个人从C编程语言中类比为malloccalloc函数)。

T obj {};使用自定义构造函数,而默认初始化T obj;要么使用自定义构造函数,要么不初始化obj

如果提供了用户定义的构造函数,则默认初始化和值初始化({})都调用相同的构造函数并具有相同的效果(取决于构造函数的实现方式)。

如果没有用户定义的默认构造函数(或者它是用default关键字定义的),也没有带std::initializer_list参数的构造函数,那么值初始化({})确保所有非静态成员都是值初始化的,而默认初始化确保成员都是默认初始化的(对于原语,这意味着它们的值是不确定的)。

我们是否总是更喜欢值初始化而不是默认初始化?

零初始化是一种额外的计算,在c++中,你不需要为你不使用的东西付费,所以如果你不需要类的某些部分具有确定值,你可以使用默认初始化(T obj)而不是值初始化(T obj{})来购买一些计算能力。

最新更新