函数调用或构造函数调用中的 C++ 数组初始化

Posted

技术标签:

【中文标题】函数调用或构造函数调用中的 C++ 数组初始化【英文标题】:C++ Array Initialization in Function Call or Constructor Call 【发布时间】:2010-04-20 16:09:52 【问题描述】:

这个问题与帖子here有关。是否可以在函数调用或构造函数调用中初始化数组?例如,类 foo 的构造函数想要一个大小为 3 的数组,所以我想调用 foo( 0, 0, 0 )。我已经尝试过了,但它不起作用。我希望能够在其他对象的构造函数初始化列表中初始化 foo 类型的对象,或者在不首先创建单独的数组的情况下初始化 foo。这可能吗?

【问题讨论】:

先说数组初始化,突然就需要初始化一个类对象。那么你需要初始化什么:一个数组对象还是一个类对象? 初始化一个类是我用作示例的一个具体案例,也是我提出这个问题的原因。但是,您也可以有一个函数 foo,它接受一个大小为 3 的数组并希望将其称为: foo( 0, 0, 0 )。我已经更改了 OP 以使其更加明显。 是的,但是您仍然在问“是否可以在不分配数组的情况下对其进行初始化?”。嗯,是的,这是可能的。例如,int a[10] = 5 初始化一个数组而不分配它,就像你问的那样。然而,这看起来不像你真正感兴趣的东西。 我明白你在说什么。我当时认为 a[] = 5 是一项任务。但是,您说得对,事实并非如此。我已经更新了帖子标题。 "没有先创建一个单独的数组" 【参考方案1】:

不在当前标准中。这将在 C++11 中成为可能

在 gcc 中,您可以使用强制转换来强制创建时间,但它不是标准 c++ (C99):

typedef int array[2];
void foo( array )   // Note: the actual signature is: void foo( int * )
int main() 
   foo( (array) 1, 2  );

【讨论】:

这在 C99 中有效,但在 C++03 中无效(在 C++0x 中也不 - 这是一个复合文字)。 代码可以使用 (macports) gcc 到 4.6; gcc 4.7 报告error: taking address of temporary array C++11 是当前标准,所以这个答案需要更新。【参考方案2】:

如果您的设计允许,您可以考虑将数据包装在一个类中,并在默认构造函数中初始化为 0(或您选择的任何值)

【讨论】:

以上是关于函数调用或构造函数调用中的 C++ 数组初始化的主要内容,如果未能解决你的问题,请参考以下文章

C++对象数组与对象指针

C++类-手动调用构造函数

C++类-手动调用构造函数

为啥我不能在 C++ 中用 new 调用参数化构造函数?

c++ 当我创建结构数组时,如何使用结构数组内的类的参数调用构造函数?

是否为数组/向量插入调用了赋值运算符或复制构造函数?