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

我的问题是为什么最后两次打印调用不会导致零值?

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

这使得scalarsvalue-initialized 而不是 default-initialized,并且 value-initialising afloat将其设置为0.f,所以一切都会正常工作。

活生生的例子

于 2014-03-07T11:17:36.983 回答
1

scalars没有显式初始化。前两个零实际上是未定义行为的结果,因此您应该在构造函数中将数组设置为零。

于 2014-03-07T11:16:08.053 回答