不调用复制构造函数的原因?

时间:2013-12-04 14:34:41

标签: c++

我知道每当返回对象时都会调用复制构造函数。在我的下面的案例中,复制construcotr没有调用。

我在互联网上浏览,我开始知道编译器遵循return value optimization技术。我相信由于没有调用复制构造器。这是真的吗?

程序控制如何进入?

//一些代码在这里

demo demo::display()
    {
        demo temp(10);
        temp.rate=45;
        return temp; //copy constructor is not called here
         }

 int main( )
    {
              demo obj1=obj1.display();
              return 0;
    }

1 个答案:

答案 0 :(得分:1)

原因是编译器优化,如您所知。创建临时对象然后复制它,然后将该副本放在obj1中,然后销毁temp,这是浪费资源。相反,编译器知道obj1将获得temp的值,因此它实际上在obj1所在的相同内存位置创建了对象temp。所以没有任何东西被复制,什 构造函数也只调用一次,temp和obj1是同一个对象。 它被称为返回值优化或RVO。

对于尚未初始化的对象调用函数并不明智。

有些情况不能以这种方式应用...... 如果你这样做了:

demo demo::display(int unknown)
{
    demo temp1(10);
    demo temp2(11);
    if(unknown) return temp1;
    else return temp2; 
}

现在,编译器不知道将返回两个对象中的哪一个,因为这取决于显示函数的参数,因此将在显示范围内创建temp1和temp2。然后在运行时,当知道它们中的哪一个将被返回时,它将被复制(猜测在哪里?)在obj1所在的完全相同的位置。 试试这个,你会看到复制构造函数被调用。