考虑以下类:
class A {
const int arr[2];
public:
A() { }
};
是否可以arr
从构造函数初始化器列表或以任何其他方式进行初始化,而不是在声明它的行(即const int arr[2] = {1,2};
)?
请注意,我对使用 C++98 的方法很感兴趣!
通过将它们包装在 a 中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;
}
}
将数组元素初始化为非零值需要 C++11 支持。
在 C++03 中,只能对数组进行值初始化,导致每个元素的值为0
:
class A {
const int arr[2];
public:
A() : arr() { }
};
对于相关的 C++03 标准,请看这个问答:
我如何使用成员初始化列表来初始化它?
(我将假设 C++98 的意思不是C++11,即 C++03 是可以接受的。如果这个假设是错误的,请说出来。)
不,这不对。