fruit()创建临时对象吗?在创建新对象时

时间:2014-11-07 07:18:52

标签: c++

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。我的问题是

  1. 如果fruit()创建临时对象,则必须调用析构函数两次,但是 析构函数只被调用一次,即f
  2. 如果它使用复制构造函数将临时对象分配给f,那么它根本不会调用复制构造函数。 (编译器是否在内部生成另一个复制构造函数用于复制临时对象?)
  3. 如果概念是关于创建临时对象,那么语句fruit f2 = fruit(fruit(fruit(f1)))不会调用任何构造函数和析构函数,它只调用复制构造函数。

    X x = X(); X x(x)如果{{1}}我理解它是如何工作的,语句是如何工作的。

1 个答案:

答案 0 :(得分:-1)

fruit f2 = fruit(fruit(fruit(f1))); 

我认为这个由编译器优化     果实f2 =果实(f1); 因为编译器注意到您复制了(临时)副本的(临时)副本,并且结果与只制作一个副本相同。

编辑:删除了评论中讨论的陈述