考虑以下课程:
class A {
const int arr[2];
public:
A() { }
};
是否可以从构造函数初始值设定项列表中初始化arr
,或者以声明它的行(即const int arr[2] = {1,2};
)之外的任何其他方式初始化?
请注意,我对使用C ++ 98的方法感兴趣!
答案 0 :(得分:4)
将它们包裹在struct
中,例如:
class A
{
struct Data
{
int arr[2];
};
Data const arr;
public:
A() : arr( someOtherStruct ) {}
};
这意味着要访问数据,您必须编写arr.arr
。
通过继承struct
:
struct PrivateDataForA
{
int arr[2];
};
class A : private PrivateDataForA
{
public:
A() : PrivateDataForA( someOtherStruct ) {}
};
这确实使struct
的名称在课堂外可见
(这可能是一个优势 - 客户端代码可以通过你作为一个
参数)。
如果你没有方便的结构实例,那就说你想要了 用它来填充从构造函数的参数计算出来的值 可以使用静态成员函数:
class A : private PrivateDataForA
{
static PrivateDataForA createInitializer( int a, int b );
public:
A( int a, int b ) : PrivateDataForA( createInitializer( a, b ) )
{
}
};
对于OP的具体例子:
#include <iostream>
#include <stddef.h>
typedef ptrdiff_t Size;
typedef Size Index;
template< class Element, Size n >
struct Array{ Element elem[n]; };
class A {
Array<int, 2> const arr_; // const int arr[2];
A& operator=( A const& ); // No such.
static Array<int, 2> const& oneAndTwo()
{
static Array<int, 2> const a = {1, 2};
return a;
}
public:
A(): arr_( oneAndTwo() ) {}
int at( Index i ) const { return arr_.elem[i]; }
};
int main()
{
using namespace std;
A o;
for( int i = 0; i < 2; ++i )
{
cout << o.at( i ) << endl;
}
}
答案 1 :(得分:2)
将数组元素初始化为非零值需要C ++ 11支持。
在C ++ 03中,只能对数组进行值初始化,导致每个元素的值为0
:
class A {
const int arr[2];
public:
A() : arr() { }
};
对于相关的C ++ 03标准,请参阅此问题和答案:
How can i use member initialization list to initialize it?
(我假设通过C ++ 98你的意思是不 C ++ 11,即C ++ 03是可以接受的。如果这个假设是错误的,请这么说。)
答案 2 :(得分:-1)
没有。不是。