从函数返回对象时调用复制构造函数?

时间:2013-11-30 10:31:49

标签: c++

我已经读过复制构造函数,当“复制一个对象从一个函数返回它时。”

所以我理解每当我们返回一个对象时调用复制构造函数是我的理解正确吗?

如果是,那么每当我们返回一个对象时,都会调用构造函数。所以,如果我们在程序中间复制构造函数将被调用。然后将值分配给类的数据成员。那么现有的价值会被取代吗?

如果不是,该句的含义是什么?

SRC:Tutorial point

 #include <iostream>

 using namespace std;

 class demo
 {
    public:
         int rate;
         demo(int init_rate);
         demo( const demo &obj_passed);
         demo display();
 };


 demo::demo(int init_rate)
 {
    cout << "\nNormal Construtor" << endl;
    rate=init_rate;
 }

 demo::demo(const demo &obj_passed) // Copy Constructor
 {
    cout << "\nCopy constructor" << endl;
    rate=obj_passed.rate;
 }

 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;
 }

,输出

Normal Constructor

3 个答案:

答案 0 :(得分:8)

假设T是对象的类型,所以我们有一个函数:

T foo() {
    T returnvalue;
    // do some stuff to the return value
    return returnvalue;
}

一些代码称之为:

T t = foo();

然后returnvalue是函数foo的本地对象。 t是调用foo的函数的本地对象。最后,“foo”的返回值是一个临时对象。所有三个对象都有T类型。

名义上,returnvalue被复制到临时对象,然后临时对象被复制到t,因此复制构造函数可以被调用两次。这就是你的参考文献所说的。不替换任何值,调用复制构造函数以便将一个对象初始化为另一个对象,具有相同类型的另一个对象。

但是,在返回对象时,复制构造函数总是被调用并不是那么简单。在此示例中,允许C ++实现通过称为“复制构造函数省略”的机制进行优化,其中它实际上对所有三个对象使用相同的位置,并且简单地省略了复制。因此,在实践中,您可以看到复制构造函数为0,1或2次。

这是针对C ++ 03的。在C ++ 11中,有些情况(同样,我的例子就是其中之一),其中移动构造函数优先于复制构造函数进行调用。因此,在C ++ 11中,如果T具有移动构造函数,则保证不会调用复制构造函数。同样,移动符合elision的条件,因此您可能会看到0,1或2个。

答案 1 :(得分:4)

您似乎对复制构造函数的含义感到困惑。复制构造函数用于创建对象。因此,复制构造函数不会替换任何值,而是将旧值复制到新对象。

答案 2 :(得分:0)

每当您返回函数的本地对象时,编译器都会将本地对象保留并重定向到您返回的位置(因此本地对象不会被删除,编译器不需要创建另一个要复制的对象本地对象的细节。) 语句完成(;)后,将删除本地对象。 另一方面,如果返回形式参数,编译器将复制相应的参数(使用复制构造函数),然后返回参数的克隆。