1

次のスニペットはヘッダー ファイルにあります。

// Represents NxN scalar values (aka square matrix).  
template<std::size_t N>
class dummy
{ 
    public:
    float& operator[](const std::size_t ind) { return scalars[ind]; }

    private:
    float scalars[N*N];
};

using dummy2 = dummy<2>;

そして、これは私がそれを使用する方法です:

// 2x2=4 floats
dummy2 d;

std::cout << d[0] << std::endl; // prints 0
std::cout << d[1] << std::endl; // prints 0
std::cout << d[2] << std::endl; // prints -1.42253e+19
std::cout << d[3] << std::endl; // prints 4.59163e-41

私の質問は、なぜ最後の 2 つの印刷呼び出しがゼロの値にならないのですか?

4

2 に答える 2

4

クラスのコンストラクターを提供しなかったため、コンパイラーは、クラスのすべてのメンバーをデフォルトで初期化するデフォルトのコンストラクターを生成します。また、組み込み型をデフォルトで初期化するということは、それがまったく初期化されていないことを意味するため、その値の使用は未定義です。つまり、scalars何にも初期化されていません。

次のように修正できます。

template<std::size_t N>
class dummy
{ 
    public:
    float& operator[](const std::size_t ind) { return scalars[ind]; }

    dummy() : scalars()
    {}

    private:
    float scalars[N*N];
};

using dummy2 = dummy<2>;

これによりscalars、default-initialized の代わりに value-initialized が作成され、value-initializing afloatが に設定される0.fため、すべてが機能します。

実際の例

于 2014-03-07T11:17:36.983 に答える
1

scalars明示的に初期化されていません。最初の 2 つのゼロは、実際には未定義の動作の結果であるため、コンストラクターで配列をゼロに設定する必要があります。

于 2014-03-07T11:16:08.053 に答える