2014-03-07 43 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未明确初始化。前两个零实际上是未定义行为的结果,因此您应该在构造函数中将数组设置为零。

相关问题