在初始化列表中初始化一个常量大小的数组
Posted
技术标签:
【中文标题】在初始化列表中初始化一个常量大小的数组【英文标题】:Initialize a constant sized array in an initializer list 【发布时间】:2012-08-03 22:38:26 【问题描述】:我的情况可以总结如下:
class Test
Test();
int MySet[10];
;
是否可以在初始化列表中初始化MySet
?
像这种初始化列表:
Test::Test() : MySet(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
有没有办法在类的初始化器列表中初始化一个常量大小的成员数组?
【问题讨论】:
不管怎样,Set
不仅仅是指向10
整数数组的指针,这里也不是static
。相反,在某些情况下,数组名称Set
衰减为指向数组第一个元素的指针。使用sizeof
可以清楚地看到差异 - 即sizeof(Set) == 10 * sizeof(int) != sizeof(int*)
。
@StuartGolodetz 感谢您的澄清。当我说静态时,我的意思是静态形式,它与对象/实例一起存储,而不仅仅是堆中的其他地方。当然,就我而言,这是对static
一词的严重滥用。对不起。
不用担心 :) 我主要是想澄清数组和指针之间的区别,以防万一出现误解。
【参考方案1】:
虽然在 C++03 中不可用,但 C++11 引入了扩展初始化列表。如果使用符合 C++11 标准的编译器,确实可以做到。
struct Test
Test() : set 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ;
int set[10];
;
上面的代码使用g++ -std=c++0x -c test.cc
编译得很好。
正如 cmets 中一位乐于助人的用户在我下面指出的那样,此代码无法使用 Microsoft 的 VC++ 编译器 cl. 编译。也许有人可以告诉我使用std::array
的等效项是否会?
#include <array>
struct Test
Test() : set 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ;
std::array<int, 10> set;
;
使用g++ -std=c++0x -c test.cc
也可以正常编译。
【讨论】:
爱 C++11(或它的某些部分)的另一个好理由! =D 非常感谢! 请注意,此代码不能与 Visual C++ 11 及更早版本一起编译(即,它不能与 Microsoft Visual Studio 2012 一起编译,而 Visual C++ 是最常见平台的主要编译器)。因此,如果您想要可移植的代码,请不要这样做。然而。 谢谢@Cheersandhth.-Alf,因为我不是 C++ 程序员,也不知道这一点。 :) @Serge 你应该确保你听从上面的建议,以防你想要可移植的代码。考虑使用std::array<int, 10>
作为替代方案,希望它也适用于 Visual C++ 11。【参考方案2】:
不幸的是,在 C++03 中,您不能在初始化列表中初始化数组。如果您的编译器较新,您可以在 C++11 中使用 :)
见:How do I initialize a member array with an initializer_list?
【讨论】:
甚至 C++98 也支持初始化列表中数组的零初始化。【参考方案3】:“我知道 Set 只是一个指向 10 个整数的静态数组的指针”
不,这是错误的:它是一个数组,而不是一个指针。
你仍然可以在构造函数的初始化列表中初始化它。
对于不支持 C++11 花括号初始化的编译器(想到 Visual C++ 版本 11 及更早版本),您将不得不跳过一些障碍,如下所示:
#include <iostream>
#include <vector>
using namespace std;
#define CPP11
#if defined( _MSC_VER )
# if (_MSC_VER <= 1700)
# undef CPP11
# endif
#endif
#ifdef CPP11
class Cpp11
private:
int set_[10];
public:
Cpp11()
: set_ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
int foo() const return set_[3];
;
#endif
class Cpp03
private:
struct IntArray10 int values[10]; ;
IntArray10 set_;
static IntArray10 const& oneToTen()
static IntArray10 const values =
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;
return values;
public:
Cpp03()
: set_( oneToTen() )
int foo() const return set_.values[3];
;
int main()
不过,不要使用原始数组,而是使用 std::vector
和 C+++11 std::array
,即使 Visual C++ 11 也支持这两者。
【讨论】:
以上是关于在初始化列表中初始化一个常量大小的数组的主要内容,如果未能解决你的问题,请参考以下文章