在循环中声明的对象只构造一次吗?

时间:2017-03-20 06:12:34

标签: c++ loops lifetime

假设我们有一个方法。方法内部是一个包含n次迭代的循环,其中声明并初始化了一个对象<input type="file" name="audio_i0" id="audio_i0"/>

  • 建造和销毁了多少次?一次,或n次?
  • 何时进行施工 - 执行线路时或何时执行 程序调用方法?
  • 什么时候发生破坏?在每次迭代结束时,at for block的结尾,还是方法的结尾?

示例:

myObj

3 个答案:

答案 0 :(得分:5)

  

它构建和销毁了多少次?一次,或n次?

n次。

  

何时进行构造 - 执行行时,或程序调用方法?

执行该行时。

  

什么时候发生破坏?在每次迭代结束时,在for块的末尾,或方法的结尾?

当离开对象的范围时;对于您的示例代码,在每次迭代结束时。

BTW:A myObj();不是对象的定义,而是函数的声明。您可以指A myObj;A myObj{};(自C ++ 11以来)。搜索most vexing parse了解详情。

答案 1 :(得分:3)

在您的代码myObj 声明但从未定义myObj被声明为不带参数的函数,并返回类型为A的对象。

非定义的声明没有运行时效果,因此循环的每次迭代都没有构造。

如果您在循环体内声明并定义了一个对象,那么它将在定义点构造,并在每次迭代时在其范围的末尾(循环体的末尾)进行破坏。

答案 2 :(得分:2)

构建并销毁了100个不同的对象。

话虽如此,如果对象的构造和破坏是微不足道的,你将不会看到性能成本。

此外,如果优化编译器能够确定构造和析构对结果没有可观察到的影响,则可以自由删除冗余代码。

但是,根据经验,只有在需要构造和破坏行为时,才能在循环中构造对象。