【发布时间】:2014-11-07 07:18:52
【问题描述】:
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) 时它是如何起作用的。
【问题讨论】:
-
副本通常会被忽略,而对象会在适当的位置创建。见copy elision。
-
您的代码中没有
fruit(2)(即使有,也不会编译)!!! -
@barakmanos 抱歉,这只是一个拼写错误。
-
T var = k等价于T var(k)。 -
@barakmanos 不,不是。
struct S { S(int) { } S(const S &) = delete; }; int main() { S s(3); }有效。S s = 3;没有。
标签: c++