class fruit{
public:
fruit(const fruit &f){
cout << "copy constructor invoked ";
}
~fruit(){
cout << "destructor invoked ";
}
fruit(){
cout << "constructor invoked ";
}
}
int main(){
fruit f1; // o/p constructor invoked
fruit f = fruit(); // o/p constructor invoked
fruit(); // o/p constructor invoked and destructor invoked
fruit f2 = fruit(fruit(fruit(f1))); // can anyone explain this statement?
// o/p copy constructor invoked
return 0; // o/p destructor invoked destuctor invoked
}
我了解到fruit f = fruit ()
fruit()
创建临时对象并使用复制构造函数将其分配给f
。我的问题是
fruit()
创建临时对象,则必须调用析构函数两次,但是
析构函数只被调用一次,即f
f
,那么它根本不会调用复制构造函数。 (编译器是否在内部生成另一个复制构造函数用于复制临时对象?)如果概念是关于创建临时对象,那么语句fruit f2 = fruit(fruit(fruit(f1)))
不会调用任何构造函数和析构函数,它只调用复制构造函数。
X x = X();
X x(x)
如果{{1}}我理解它是如何工作的,语句是如何工作的。
答案 0 :(得分:-1)
fruit f2 = fruit(fruit(fruit(f1)));
我认为这个由编译器优化 果实f2 =果实(f1); 因为编译器注意到您复制了(临时)副本的(临时)副本,并且结果与只制作一个副本相同。
编辑:删除了评论中讨论的陈述