繁体   English   中英

C++ 返回调用者未调用构造函数

[英]Return to caller not invoking constructor in C++

我正在学习复制省略并尝试了一些东西来了解它。 但是下面的代码发生了意想不到的事情:

template<typename T>
class AutoPtr
{
    T* m_ref;
    public:
    AutoPtr(T* ref)
    {
        printf("Cons called\n");
        m_ref = ref;
    }
    AutoPtr(const AutoPtr& autoPtr)
    {
        printf("Copy called\n");
        m_ref = autoPtr.m_ref;

    }
    ~AutoPtr()
    {
        delete m_ref;
    }
};

class Reference
{
    public:
        Reference()
        {
            printf("Reference created\n");
        }
        ~Reference()
        {
            printf("Reference deleted\n");
        }
};

AutoPtr<Reference> generateRes()
{
    Reference *ref = new Reference();

     //Scenario 1
    //AutoPtr<Reference> temp{ref};
    //return temp;

    //Scenario 2
    return AutoPtr<Reference>{ref};
}                                                                                                                       
int main()
{
    AutoPtr<Reference> obj1 = generateRes();
    return 0;
}

在上面的代码中,我尝试了两种场景。

  1. 初始化临时 AutoPtr object 然后返回它。 这里,构造函数在 temp 初始化时被调用。 但是在main function中,初始化obj1时,并没有调用constructor。
  2. 直接返回temporary object。这里在main function中,初始化了obj1,调用了constructor。

为什么场景 1 不调用 obj1 的构造函数? 是一些编译器优化吗? 我知道发生了复制省略并且没有调用复制构造函数,但为什么普通构造函数没有被调用两次?

我想你错过的关于复制省略的部分就是它所暗示的。 如果没有复制构造发生,新的(调用方)object 是从什么构造的?

没有复制(或移动)意味着只有一个 object 这意味着构造是在目的地完成的,即在 function 内部构造返回值 == 在外部构造返回值。

这也与您的复制赋值运算符AutoPtr operator=(const AutoPtr&) ,因为AutoPtr<Reference> obj1 = generateRes(); 是一个初始化

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM