在构造函数初始化列表中初始化成员数组(C++11之前)

Posted

技术标签:

【中文标题】在构造函数初始化列表中初始化成员数组(C++11之前)【英文标题】:Initializing member array in constructor initialization list (before C++11) 【发布时间】:2012-11-14 14:18:40 【问题描述】:

据我所知,在 C++11 之前,在构造函数初始化列表中初始化成员数组的唯一方法是执行以下操作,例如:

MyClass::MyClass(int arg) : member(arg), memberArray() 
    // anything else that needs to be done in the c'tor

但是,我有几个人告诉我他们不赞成这种方法,并且在构造函数主体的 for 循环中对其进行零初始化可能会更安全/更具可读性。

我还没有 C++11 支持,所以我不能使用初始化列表等。是否有任何人听说过不鼓励在构造函数初始化列表中初始化成员数组的准则?

另外,测试表明没有,但是将这种语法用于多维数组应该没有任何问题,对吗? (例如,这不是某些编译器出于某种原因搞砸的标准的一部分......)

我并不是说这是一个主观问题——我只是想知道是否有充分的理由使用/不使用上述语法。

非常感谢您的帮助。

【问题讨论】:

不,这不是唯一的方法,MyClass::MyClass(int arg) : member(arg), memberArray(some_function(arg))some_function 构造你想要的值,效果很好。 @ArmenTsirunyan 我确实看到了这个问题,但我更感兴趣的是这是否是一种好的做法,而不是如何去做。 在 C++03 中,您只是无法初始化成员数组(值初始化除外)。 @KerrekSB 那么上面的语法不起作用吗?我以为它对成员数组进行了零初始化,不是吗? @llakais:是的,确实如此——这就是值初始化。但是您不能将数组初始化为任何 other 值。如果你所需要的只是零,那么你很好。 【参考方案1】:

您可能想看看 *** 上的 related question :使用静态函数在初始化列表中初始化您的成员数组可以实现您正在寻找的内容:

class MyClass

   typedef std::array< int, 2 > t_myA;
   static t_myA fillFunction() static t_myA const ret = 1,2; return ret; ;

   t_myA myArray;

   public MyClass();


MyClass::MyClass()
 : myArray( fillFunction() )


【讨论】:

以上是关于在构造函数初始化列表中初始化成员数组(C++11之前)的主要内容,如果未能解决你的问题,请参考以下文章

C++构造函数的初始化列表

为啥就地成员初始化在 C++11 中使用复制构造函数?

c语言如何对结构体某一成员初始化

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]

在构造函数初始化器中初始化成员数组

是否可以在 C++ 的成员初始化程序列表中初始化数组?