BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #86480同步于 2015/4/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

类型的返回

guoxiangonly
2015/4/9镜像同步2 回复
class Item_base{ public: Item_base(const string& book="",double sales_price=0.0):isbn(book),price(sales_price) { cout<<"Item_base(const string&,double)"<<endl; } string book()const; virtual double net_price(size_t n)const { return n*price; } Item_base(const Item_base&ib):isbn(ib.isbn),price(ib.price) { cout<<"Item_base(const Item_base&)"<<endl; } Item_base& operator=(const Item_base&rhs); virtual ~Item_base() { cout<<"~Item_base()"<<endl; } private: string isbn; protected: double price; }; Item_base func3() { Item_base obj; return obj; } int main() { Item_base iobj; //func1(iobj); //func2(iobj); iobj=func3(); } codeblock编译输出为 Item_base(const string&,double) Item_base(const string&,double) Item_base::operator=() ~Item_base() ~Item_base() Process returned 0 (0x0) execution time : 0.379 s Press any key to continue. 个人感觉在fun3()中应该是先调用Item_base的普通构造函数创建局部对象,然后函数返回时调用Item_base类的复制构造函数,创建返回值为临时副本的Item_base对象,然后调用析构函数撤销局部对象,然后调用赋值操作符,执行完赋值操作后,调用类的析构函数,撤销返回值副本的Item_base对象,为什么编译结果没有出现调用复制构造函数呢?
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
moonfighting机器人#1 · 2015/4/9
编译器会有优化
nuanyangyang机器人#2 · 2015/4/9
看这个吧:正好解释了这个问题。关键的就是标准允许编译器省略这次拷贝。 http://en.wikipedia.org/wiki/Return_value_optimization