【问题标题】:does fruit() create temporary object? when creating new objectfruit() 会创建临时对象吗?创建新对象时
【发布时间】: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。我的问题是

  1. 如果fruit() 创建临时对象,则必须调用析构函数两次,但 析构函数只被调用一次,即f
  2. 如果它使用复制构造函数将临时对象分配给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 &amp;) = delete; }; int main() { S s(3); } 有效。 S s = 3; 没有。

标签: c++


【解决方案1】:
fruit f2 = fruit(fruit(fruit(f1))); 

我认为这个已经被你的编译器优化为 水果 f2 = 水果(f1); 因为编译器注意到您制作了(临时)副本的(临时)副本的副本,并且结果与仅制作一个副本相同。

编辑:删除了cmets中讨论过的声明

【讨论】:

  • 它们相同。复制省略只是一种可能,如果复制构造函数不可访问,前一种形式无法编译。
  • 我试过没有复制构造函数和fruit f = fruit();仍然编译。
  • 两种可能:编译器为您创建了一种,因为您没有明确删除它;或者您正在使用不符合此规定的 MSVC。
  • 是的,如果您将其声明为私有,则我的错误是无法编译。但是说>在这种情况下
  • 没有。正如我所说,标准没有强制要求复制省略,因此它取决于编译器和优化标志。如果这种编译器依赖关系符合“相同”的条件,那么您不妨说“int32_t”与“int”相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 2014-06-01
  • 2014-08-03
  • 2011-08-17
  • 2022-01-06
  • 1970-01-01
相关资源
最近更新 更多