动态数组的初始化列表?

rit*_*ter 12 c++ arrays dynamic

可以为静态数组的定义提供初始化列表.例:

int main()
{
  int int_static[2] = {1,2};
}
Run Code Online (Sandbox Code Playgroud)

动态数组是否可以使用类似的初始化列表?

int main()
{
  int* int_ptr = new int[2];
}
Run Code Online (Sandbox Code Playgroud)

这更接近我想要做的事情:

struct foo
{
  foo(){}
  foo(void * ptr): ptr_(ptr) {}
  void * ptr_;
};

int main()
{
  foo* foo_ptr = new foo[10];
}
Run Code Online (Sandbox Code Playgroud)

在初始化时,不应该调用默认构造函数,而是调用foo:foo(void*).

对于动态数组的静态初始化程序列表而言,如果加速器核心的实时编译只有有限的堆栈可用,但同时用(加速器编译时间=主机运行时间)静态初始化列表.

我假设没有(因为这需要编译器生成额外的代码,即将参数的值复制到堆位置).我认为c ++ 0x支持其中一些,但我无法使用它.现在我可以使用这样的结构.也许有人知道一招

最好!

Dao*_*Wen 15

在OP发布这个问题时,C++ 11的支持可能还不是很普遍,这就是为什么接受的答案说这是不可能的.但是,现在应该在所有主要的C++编译器中支持使用显式初始化列表初始化动态数组.

语法new int[3] {1, 2, 3}在C++ 11中标准化.在cppreference.com上引用新的表达式页面:

由new-expression创建的对象根据以下规则初始化:
...
如果type是数组类型,则初始化对象数组:
...
如果初始化程序是括号括起的参数列表,则数组为总初始化.(自C++ 11以来)

因此,考虑到OP的示例,在使用C++ 11或更新版本时,以下内容完全合法:

foo * foo_array = new foo[2] { nullptr, nullptr };
Run Code Online (Sandbox Code Playgroud)

请注意,通过在初始化列表中提供指针,我们实际上是在哄骗编译器应用foo(void * ptr)构造函数(而不是默认构造函数),这是所需的行为.


Naw*_*waz 11

不,你做不到.

我认为C++不允许这样做,因为允许这样的东西不会为语言添加任何好的功能.换句话说,如果使用静态初始化程序初始化它,动态数组的重点是什么?

动态阵列的点是创建大小的数组N,其已知在运行时,根据实际的需要.也就是代码

int *p = new int[2]; 
Run Code Online (Sandbox Code Playgroud)

对我来说不如以下:

int *p = new int[N]; //N is known at runtime
Run Code Online (Sandbox Code Playgroud)

如果是这样,那么如何在静态初始值设定项中提供元素数量,因为N直到运行时才知道?

让我们假设您可以写这个:

int *p = new int[2] {10,20}; //pretend this!
Run Code Online (Sandbox Code Playgroud)

但是你写这个有什么大的优势?没有.它几乎相同:

int a[] = {10,20};
Run Code Online (Sandbox Code Playgroud)

真正的优势是当你被允许为N元素数组编写时.但问题是这样的:

 int *p = new int[N] {10,20, ... /*Oops, no idea how far we can go? N is not known!*/ };
Run Code Online (Sandbox Code Playgroud)

  • 对于记录,"动态"并不意味着"可变长度".它确实是一个"很棒的功能",能够创建一个新的动态对象并将其初始化为已知的初始内容.这正是构造函数为类和结构类型对象所做的事情. (5认同)