优艾设计网

函数返回临时对象时有没有调用拷贝构造函数??

优艾设计网 https://www.uibq.com 2023-06-10 07:48 出处:网络 作者:PS教程
函数返回临时对象时,有没有进行拷贝?会不会调用拷贝构造函数?以下两段代码的区别只是一个显式定义了拷贝构造函数,一个没有定义,MSVC2013编译后运行的结果不同。但是可以从结果中看出,第一个并没有调用拷贝构造函

函数返回临时对象时,有没有进行拷贝?会不会调用拷贝构造函数?
以下两段代码的区别只是一个显式定义了拷贝构造函数,一个没有定义,MSVC2013编译后运行的结果不同。但是可以从结果中看出,第一个并没有调用拷贝构造函数,到底是什么导致两者不同的结果呢?

代码一:

#include <iostream>class A{ public: A(){ std::cout << this << " created" <<优艾设计网_在线设计 std::endl; } ~A(){ std::cout << this << " destroied" << std::endl; } A(const A& a){ std::cout << "copy " << &a << " to " << this << std::endl; }// here is the difference void fn(){ std::cout << this << " call fn" << std::endl; } };A fn() { A a; return a; }int main() { A& a = fn(); a.fn(); return 0; }

实际运行结果:

0079FC7B created 0079FC7B call fn 0079FC7B destroied

代码二:

#include <iostream>class A{ public: A(){ std::cout << this << " created" << std::endl; } ~A(){ std::cout << this << " destroied" << std::endl; } void fn(){ std::cout << this << " call fn" << std::endl; } };A fn() { A a; return a; }int main() { A& a = fn(); a.fn(); return 0; }

实际运行结果:

00EFF94B created 00EFF94B destroied 00EFF967 call fn 00EFF967 destroied

已找到没有调用拷贝构造函数的可能原因:使用Release方式进行编译的


大连888999 10小时前

首先,我用g+优艾设计网_设计+不能编译你的代码,A& a = fn();这一句报错:用类型为‘A’的右值初始化类型为‘A&’的非常量引用无效。


不可一世的小女人xiaohui 优艾设计网_设计客 9小时前

把引用去掉后(A a = fn();)发现还是没有调用copy constructor。网上查了一下发现这叫“copy elision”,就是说copy constructor即使有副作用还是会被编译器优化掉的。


0

精彩评论

暂无评论...
验证码 换一张
取 消