我有一个情况,可以总结如下:
class Test
{
Test();
int MySet[10];
};
是否可以MySet
在初始化列表中进行初始化?
像这种初始化列表:
Test::Test() : MySet({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) {}
有没有办法在类的初始化器列表中初始化一个常量大小的成员数组?
我有一个情况,可以总结如下:
class Test
{
Test();
int MySet[10];
};
是否可以MySet
在初始化列表中进行初始化?
像这种初始化列表:
Test::Test() : MySet({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) {}
有没有办法在类的初始化器列表中初始化一个常量大小的成员数组?
虽然在 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
.
正如评论中一位乐于助人的用户在我下方指出的那样,此代码不能使用 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++03 中,您不能在初始化列表中初始化数组。如果您的编译器较新,您可以在 C++11 中使用 :)
“我知道 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 也支持这两者。