我已经读过复制构造函数,当"复制一个对象从函数返回它"时调用.
所以我理解每当我们返回一个对象时调用复制构造函数是我的理解正确吗?
如果是,那么每当我们返回一个对象时,都会调用构造函数.所以,如果我们在程序中间复制构造函数将被调用.然后将值分配给类的数据成员.那么现有的价值会被取代吗?
如果不是,这句话的意思是什么?
SRC:教程点
#includeusing 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
Steve Jessop.. 9
假设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.
假设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.