4

考虑以下类:

class A {
    const int arr[2];
public:
      A() { }
};

是否可以arr从构造函数初始化器列表或以任何其他方式进行初始化,而不是在声明它的行(即const int arr[2] = {1,2};)?

请注意,我对使用 C++98 的方法很感兴趣!

4

3 回答 3

4

通过将它们包装在 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;
    }
}
于 2011-11-17T18:20:57.133 回答
2

将数组元素初始化为非零值需要 C++11 支持。

在 C++03 中,只能对数组进行值初始化,导致每个元素的值为0

class A {
    const int arr[2];
public:
    A() : arr() { }
};

对于相关的 C++03 标准,请看这个问答:
我如何使用成员初始化列表来初始化它?

(我将假设 C++98 的意思不是C++11,即 C++03 是可以接受的。如果这个假设是错误的,请说出来。)

于 2011-11-17T18:04:01.663 回答
-2

不,这不对。

于 2011-11-17T17:59:35.697 回答