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

 云妹12241999 发布于 2023-02-13 17:44

我已经读过复制构造函数,当"复制一个对象从函数返回它"时调用.

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

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

如果不是,这句话的意思是什么?

SRC:教程点

 #include 

 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

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.

1 个回答
  • 假设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.

    2023-02-13 17:49 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有