以下代码段位于头文件中:
// 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
我的问题是为什么最后两个打印调用不会导致零值?
答案 0 :(得分: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
,因此一切都会正常工作。
答案 1 :(得分:1)
scalars
未明确初始化。前两个零实际上是未定义行为的结果,因此您应该在构造函数中将数组设置为零。