调用C++中的构造函数

Calling constructor in C++

本文关键字:构造函数 C++ 调用      更新时间:2023-10-16

我有和这篇文章基本相同的问题,但当我去测试最高答案时,我没有得到预期的结果。

我有以下课程:

class Test
{
public:
    Test()
    {
        std::cout << "default constructor" << std::endl;
    }
    Test(const Test &other)
    {
        std::cout << "copy constructor" << std::endl;
    }
    Test& operator=(const Test &other)
    {
        std::cout << "assignment operator" << std::endl;
        return *this;
    }
    ~Test()
    {
        std::cout << "destructor" << std::endl;
    }
};

只是为了跟踪调用了哪些构造函数。然后我主要有以下代码:

Test t1 = Test();

根据链接帖子中的答案,我预计会有四行输出:一行用于默认构建临时对象,一行用于复制,还有两个析构函数调用:一个用于销毁临时对象,另一行用于t1。然而,我只得到了两行:"default constructor"answers"destructor",可能都是在退出main()后为t1指定的。有人能详细解释一下发生了什么吗?有人能解释一下为什么这里使用赋值运算符吗?难道它不应该期望一个左值(因为它需要一个左值ref),而临时对象是一个右值吗?

C++不必在实际不需要时调用构造函数。在您的情况下,它知道对象是用右边的调用结果创建的,所以它跳过中间步骤。

通过添加-fno-elide构造函数标志,您可以看到您期望的结果,但在实践中永远不应该这样做。

http://en.cppreference.com/w/cpp/language/copy_elision

现场观看:http://melpon.org/wandbox/permlink/OoxFy1dV6LB3QDbH