c++ - 这个简单的 C++ 模板类有什么问题?

标签 c++ operator-overloading template-classes

以下代码片段在头文件中:

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

我的问题是为什么最后两次打印调用没有产生零值?

最佳答案

您没有为您的类提供构造函数,因此编译器生成一个默认构造函数,默认初始化该类的所有成员。默认初始化一个内置类型意味着它根本没有被初始化,所以对它的值的任何使用都是未定义的。换句话说,标量 没有初始化为任何东西。

你可以这样修复它:

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

关于c++ - 这个简单的 C++ 模板类有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22248452/

相关文章:

c++ - 如何使用模板类作为模板参数在模板类中正确定义模板函数

c++ - Getter和实例变量,引用,指针还是对象?

c++ - 如何调试链接器错误?静态链接 ICU 时出现 undefined reference 错误

c# - C# 中基于接口(interface)编程的运算符重载

python - Python 中的运算符重载 : handling different types and order of parameters

c++ - 来自引用包装器的 Const 引用包装器

python - c++中python "type(<name>, <bases>, <dict>)"的等价物是什么?

c++ - 在第二个线程中显示图像,OpenCV?

c++ - 如何重载运算符=

c++ - 模板类类型特定的函数