gpt4 book ai didi

c++ - 我可以指定默认值吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:25:50 25 4
gpt4 key购买 nike

为什么对于用户定义的类型,在创建对象数组时,此数组的每个元素都使用默认构造函数初始化,但当我创建内置类型的数组时,情况并非如此?

第二个问题:是否可以在初始化数组中的元素时指定要使用的默认值?像这样(无效):

char* p = new char[size]('\0');

当我使用数组时,这个主题中的另一个问题。我想当创建一个用户定义类型的数组时,这个数组的每个元素都将被初始化为默认值。这是为什么?

如果内置类型的数组不使用默认值初始化它们的元素,为什么要为用户定义类型这样做?

有没有办法以某种方式避免/规避这种默认构造?例如,如果我创建了一个大小为 10000 的数组,这似乎有点浪费,它强制调用 10000 个默认构造函数,初始化我将(稍后)覆盖的数据。

我认为行为应该是一致的,所以要么初始化每种类型的数组,要么不初始化。而且我认为内置数组的行为更合适。

最佳答案

这就是内置类型在 C++ 中的工作方式。为了初始化它们,你必须提供一个显式的初始化器。如果不这样做,则该对象将保持未初始化状态。此行为绝不特定于数组。独立对象的行为方式完全相同。

这里的一个问题是,当您使用 new[] 创建数组时,您提供初始化器(在当前版本的语言中)的选项非常有限。事实上,您唯一可以提供的初始化程序是空的 ()

char* p = new char[size](); 
// The array is filled with zeroes

char 类型(或任何其他标量类型)的情况下,() 初始化程序将导致零初始化,这正是您尝试执行的操作。

当然,如果您想要的默认值不为零,那您就不走运了,这意味着您之后必须显式地将默认值分配给 new[]-ed 数组的元素.

至于使用用户定义的默认构造函数禁用对类型数组的默认构造函数调用...嗯,用普通的 new[] 无法实现。但是,您可以通过实现自己的数组构造过程来实现这一点(例如,std::vector 就是这样做的)。您首先为整个数组分配原始内存,然后以您认为合适的任何方式逐个手动构造元素。标准库提供了一些专门用于该目的的原语。这包括 std::allocatoruninitialized_copyuninitialized_fill 等函数。

关于c++ - 我可以指定默认值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2593167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com