c++ - 在 C++ 中正确实例化一个对象

标签 c++

<分区>

我有一些时间使用 C,一般较少时间使用 OOP,但直到现在才开始尝试学习 C++。这是关于模板的练习。

我有一个简单的类:

struct type {

    type(double data = 0) : data(data)
    {
        std::cout << "at type constructor" << std::endl;
    }

    friend std::ostream& operator<<(std::ostream& out, const type &that)
    {
        return out << "[" << std::setfill('0') << std::setw(7) <<
            std::fixed << std::setprecision(2) << that.data << "]";
    }

    private:
        double data;
};

还有一个基本模板:

template<typename T>
struct mat4 {

    T a1, a2, a3, a4;
    T b1, b2, b3, b4;
    T c1, c2, c3, c4;
    T d1, d2, d3, d4;

    mat4 (T a1 = T(), T a2 = T(), T a3 = T(), T a4 = T(),
          T b1 = T(), T b2 = T(), T b3 = T(), T b4 = T(),
          T c1 = T(), T c2 = T(), T c3 = T(), T c4 = T(),
          T d1 = T(), T d2 = T(), T d3 = T(), T d4 = T()) :
        a1(a1), b1(a2), c1(a3), d1(a4),
        a2(b1), b2(b2), c2(b3), d2(b4),
        a3(c1), b3(c2), c3(c3), d3(c4),
        a4(d1), b4(d2), c4(d3), d4(d4)
    {
        std::cout << "at mat4 consctructor" << std::endl;
    }

    friend std::ostream& operator<<(std::ostream& out, const mat4 &that)
    {
        return out << that.a1 << that.a2 << that.a3 << that.a4 << std::endl <<
                  that.b1 << that.b2 << that.b3 << that.b4 << std::endl <<
                  that.c1 << that.c2 << that.c3 << that.c4 << std::endl <<
                  that.d1 << that.d2 << that.d3 << that.d4;
    }
};

与主程序:

int main(int argc, char *argv[])
{
    mat4<type> mat1(1, 0, 0, 0,
                    0, 1, 0, 0,
                    0, 0, 1, 0,
                    0, 0, 0, 1);

    std::cout << mat1 << std::endl;

    mat4<type> mat2();

    std::cout << mat2 << std::endl;

    mat4<type> mat3;

    std::cout << mat3 << std::endl;

    return 0;
}

现在,mat1 和 mat3 已正确实例化,但 mat2 表现异常。大概这是一个微不足道的问题,但我只是非常努力地失败了。产生的输出如下:

at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at mat4 consctructor
[0001.00][0000.00][0000.00][0000.00]
[0000.00][0001.00][0000.00][0000.00]
[0000.00][0000.00][0001.00][0000.00]
[0000.00][0000.00][0000.00][0001.00]
1
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at type constructor
at mat4 consctructor
[0000.00][0000.00][0000.00][0000.00]
[0000.00][0000.00][0000.00][0000.00]
[0000.00][0000.00][0000.00][0000.00]
[0000.00][0000.00][0000.00][0000.00]

如您所见,mat1 和 mat3 的输出很好,而 mat2 的输出是 1。为什么?

我是否正确地实例化了对象?在自动内存中初始化对象的正确方法是什么?我知道这对于基于范围的资源管理很重要...

我具有初级 C++ 技能,您可能会很快发现错误。我只想了解我做错了什么以及为什么。 提前感谢您的关注。

最佳答案

如果启用编译警告,您会得到:

main.cpp:59:20: warning: empty parentheses interpreted as a function declaration [-Wvexing-parse]
    mat4<type> mat2();
                   ^~
main.cpp:59:20: note: remove parentheses to declare a variable
    mat4<type> mat2();
                   ^~
main.cpp:61:18: warning: address of function 'mat2' will always evaluate to 'true' [-Wpointer-bool-conversion]
    std::cout << mat2 << std::endl;
              ~~ ^~~~

这几乎解释了一切,除了 true 在输出时被转换为 1,这就是为什么你得到 1

关于c++ - 在 C++ 中正确实例化一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36200800/

相关文章:

c++ - 为什么这不会编译以及如何实现才能编译?

c++ - 为什么/何时不需要 __declspec( dllimport )?

c++ - 使用qi::lexeme解析 '.'链式标识符列表,并防止空间跳过

c++ - C++ 中的回溯

c++ - 在没有 reinterpret_cast 的情况下将 unsigned char 转换为 std::string 的方法?

c++ - 关闭句柄/存储句柄

c++ - 如何创建一堆不同类型的变量?

c++ - 将参数传递给 C++ 中的无操作宏

c++ - 多态对象的容器

c++ - 是什么让二进制流如此特别?