3

私はもともと次のようなコードを書きました:

class Foo
{
public:
  Foo() : m_buffer()
    {}

private:
  char   m_buffer[1024];
};

私より頭のいい人が、m_buffer() イニシャライザを使用するとメモリがゼロになると言いました。私の意図は、メモリを初期化しないままにすることでした。これ以上議論する時間はありませんでしたが、好奇心をそそられました。

以前は、各メンバーを常にイニシャライザ リストにリストするのが賢明だと考えていました。

誰かがこの動作についてさらに説明してもらえますか?

1) empty-paren イニシャライザがメモリを埋めるのはなぜですか?

2) POD データ型にのみ適用されますか? そうだと聞きましたが、手元に規格がありません。

ありがとう

4

2 に答える 2

11

そのように初期化されたメンバーがある場合、それはvalue-initialized. これは、POD にも当てはまります。構造体の場合、すべてのメンバーがそのように値で初期化され、配列の場合、そのすべての要素が値で初期化されます。

ポインターや整数などのスカラー型の値の初期化では、初期化し0て正しい型に変換します。したがって、null ポインターまたは false または具体的に持っている型を取得します。

ルールが C++98 から C++03 (現在のもの) に微妙に変更されたことに注意してください。これにより、驚くべき効果が得られる可能性があります。C++98 にはそれがありませんでしたvalue-initialization。デフォルトの初期化が発生すると述べました。これは、POD 以外の型の場合、常にデフォルトのコンストラクターが呼び出されることを意味していました。しかしvalue-initialization、C++03 では、ユーザー宣言のコンストラクターがない場合、特別な意味があります。その場合、すべての要素が値で初期化されます。

違いは次のとおりです。

struct A { int c; ~A() { } }; // non-POD, but no user declared ctor
struct B { A a; B():a(){ } } b;

現在、C++03 では、b.a.cがゼロであることが保証されます。C++98 では、b.a.c不確定な値がいくつかあります。

于 2009-04-09T16:43:08.043 に答える
1

以前は、各メンバーを常にイニシャライザ リストにリストするのが賢明だと考えていました。

これは、すべてのメンバーが初期化されていることを確認するためです。

タスクを解決するには、イニシャライザ リストから m_buffer を削除するだけです。

template <typename T>
struct C
{
    C():
        buff(),
        var(),
        object()
    {
    }
    T buff[128];
    T var;
    std::string object;
};

T 型が T() を使用しているものは何でも、デフォルトのコンストラクターに使用されます。int、chars などの場合は 0、配列の場合は {T()} です。クラスの場合、それは単にデフォルトのコンストラクターです。

于 2009-04-09T16:34:06.770 に答える