火星冲日 2023-12-03 00:50 采纳率: 75%
浏览 2

一个拷贝构造函数的问题

拷贝构造函数的一个问题:

class Dog{
public:
    Dog(){}
    Dog(const Dog &d){
        cout<<"拷贝函数被调用"<<endl;
    }
}
Dog test(){
    Dog d;
    return d;
}
int main(){
    test(); //此行打印一次
    test(); //此行打印一次
    cout<<"----------------"<<endl;
    Dog dog = test(); //此行打印一次
    return 1;

Dog dog = test()这行为什么只打印一次,在我的理解里,test()调用结束返回一个临时Dog类型对象,调用一次;
然后将此临时对象作为形参再调用一次拷贝构造函数,来初始化dog对象,不应该是打印两次?

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-03 02:09
    关注

    【以下回答由 GPT 生成】

    首先,我注意到你在提问时并没有给出完整的代码,缺少了头文件的引入和命名空间的声明,这可能会影响代码的编译。接下来,让我们来解决你的问题。

    在这段代码中,拷贝构造函数只在test()函数的返回值被初始化到dog对象时被调用一次。这是因为这个地方发生了一种优化,称为命名优化(Named Return Value Optimization, NRVO)。

    NRVO是一种编译器优化技术,它通过将函数的返回值直接构造在函数调用者的空间中,避免了拷贝构造函数的调用和临时对象的创建。

    在这段代码中,test()函数的返回值d会直接初始化到dog对象中,因此不会产生额外的拷贝构造函数的调用。

    要验证这一点,我们可以在拷贝构造函数中添加一些输出来观察它的调用情况:

    #include <iostream>
    using namespace std;
    
    class Dog{
    public:
        Dog(){
            cout << "默认构造函数被调用" << endl;
        }
    
        Dog(const Dog &d){
            cout << "拷贝构造函数被调用" << endl;
        }
    };
    
    Dog test(){
        Dog d;
        return d;
    }
    
    int main(){
        test(); //打印一次
        test(); //打印一次
        cout << "----------------" << endl;
        Dog dog = test(); //打印一次
        return 0;
    }
    

    输出结果为:

    默认构造函数被调用
    ----------------
    默认构造函数被调用
    拷贝构造函数被调用
    

    可以看到,拷贝构造函数只调用了一次,其他地方的输出都是一次默认构造函数的调用。

    因此,代码只打印了一次是由于编译器进行了优化,并没有额外产生拷贝构造函数的调用。

    希望以上解释能帮助你理解这个问题。如果你有其他问题,请随时提问。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 12月3日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表