返回信息流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对象,为什么编译结果没有出现调用复制构造函数呢?
这是一条镜像帖。来源:北邮人论坛 / cpp / #86480同步于 2015/4/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
类型的返回
guoxiangonly
2015/4/9镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
看这个吧:正好解释了这个问题。关键的就是标准允许编译器省略这次拷贝。 http://en.wikipedia.org/wiki/Return_value_optimization