为了账号安全,请及时绑定邮箱和手机立即绑定

在构造函数初始值设定项中初始化成员数组

在构造函数初始值设定项中初始化成员数组

C++
四季花海 2019-11-30 13:07:09
class C {public: C() : arr({1,2,3}) //doesn't compile{}    /*    C() : arr{1,2,3} //doesn't compile either{}    */private: int arr[3];};我相信原因是只能使用=语法来初始化数组,即:int arr[3] = {1,3,4};问题我该怎么做我想做的事情(即在构造函数中初始化一个数组(不在主体中分配元素))。可能吗C ++ 03标准是否对在ctor初始化程序中初始化聚合(包括数组)有什么特别的建议?还是上述代码的无效是其他一些规则的必然结果?C ++ 0x初始化程序列表可以解决问题吗?PS:请不要提及向量,boost :: arrays及其对数组的优越性,我很清楚。
查看完整描述

3 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

我该怎么做我想做的事情(即在构造函数中初始化一个数组(不在主体中分配元素))。可能吗?

是。它使用包含数组的结构。您说您已经知道这一点,但是我不明白这个问题。这样,您确实可以在构造函数中初始化数组,而无需在主体中进行赋值。这是做什么的boost::array。


C ++ 03标准是否对在ctor初始化程序中初始化聚合(包括数组)有什么特别的建议?还是上述代码的无效是其他一些规则的必然结果?


内存初始化器使用直接初始化。并且第8条的规则禁止这种事情。我不确定以下情况,但某些编译器确实允许这种情况。


struct A {

  char foo[6];

  A():foo("hello") { } /* valid? */

};

有关更多详细信息,请参见此GCC PR。


C ++ 0x初始化程序列表可以解决问题吗?


是的,他们有。但是,我认为您的语法无效。您必须直接使用花括号来启动列表初始化


struct A {

  int foo[3];

  A():foo{1, 2, 3} { }

  A():foo({1, 2, 3}) { } /* invalid */

};


查看完整回答
反对 回复 2019-11-30
?
守候你守候我

TA贡献1802条经验 获得超10个赞

除了将数组归零(或为非POD元素,值初始化)外,C ++ 98不提供任何直接语法。为此,您只需编写C(): arr() {}。


我对Roger Pate所说的C ++ 0x聚合初始化的局限性说错了,但是我懒得查找或检查它,这没关系,对吗?编辑:罗杰(Roger)在谈论“ C ++ 03”,我误读为“ C ++ 0x”。抱歉,罗杰。☺


当前代码的C ++ 98解决方法是将数组包装在中struct,然后从该类型的静态常量对其进行初始化。无论如何,数据都必须驻留在某个地方。袖套看起来像这样:


class C 

{

public:

    C() : arr( arrData ) {}


private:

     struct Arr{ int elem[3]; };

     Arr arr;

     static Arr const arrData;

};


C::Arr const C::arrData = {{1, 2, 3}};


查看完整回答
反对 回复 2019-11-30
?
慕容森

TA贡献1853条经验 获得超18个赞

解决方法:


template<class T, size_t N>

struct simple_array { // like std::array in C++0x

   T arr[N];

};



class C : private simple_array<int, 3> 

{

      static simple_array<int, 3> myarr() {

           simple_array<int, 3> arr = {1,2,3};

           return arr;

      }

public:

      C() : simple_array<int, 3>(myarr()) {}

};


查看完整回答
反对 回复 2019-11-30
  • 3 回答
  • 0 关注
  • 817 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信