2014-03-07 40 views
1

下面的片段是在頭文件:這個簡單的C++模板類有什麼問題?

// 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 

我的問題是,爲什麼不過去的兩個打印調用導致零值?

+8

你有初始化標量嗎? – billz

回答

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值初始化的,而不是默認初始化,和值初始化一個float套它0.f,那麼一切都將正常工作。

Live example

1

scalars未明確初始化。前兩個零實際上是未定義行爲的結果,因此您應該在構造函數中將數組設置爲零。

相關問題