临时对象
在某些情况下,创建临时对象编译器是必需的。这些临时对象可以出于以下原因创建的:
若要初始化 const 引用与类型的初始值设定项与初始化引用的基础类型不同。
存储返回用户定义的类型函数的返回值。,仅当程序不复制值返回到对象,这些 temporaries 创建。例如:
UDT Func1(); // Declare a function that returns a user-defined // type. ... Func1(); // Call Func1, but discard return value. // A temporary object is created to store the return // value.
由于返回值不被复制到另一个对象,临时对象创建。temporaries 创建的更常见的情况是在必须调用重载运算符函数表达式的计算时。这些重载运算符函数返回通常不复制到另一个对象的用户定义的类型。
考虑表达式 ComplexResult = Complex1 + Complex2 + Complex3。该表达式 Complex1 + Complex2 ,都计算,并将结果在一个临时对象存储。接下来,表达式 临时 + Complex3 ,都计算,并将结果复制到 ComplexResult (赋值运算符没有重载的话)。
存储转换的结果成用户定义的类型。在特定类型的对象显式转换为用户定义的类型时,该新对象构造作为临时对象。
临时对象具有由其点定义创建和点它们被销毁的生存期。创建的任何表达式多个临时对象在创建的相反的顺序最终销毁它们。将在哪损坏下表中发生显示。
损坏为临时对象点
创建的原因临时 |
损坏点 |
---|---|
表达式计算的结果 |
由于表达式计算时创建的所有 temporaries 销毁在表达式语句的结尾 (即分号),或在 for、 if、 while、 do和 switch 语句中的控制表达式的结尾。 |
初始化 const 引用 |
如果初始值设定项不是与初始化的引用,临时基础对象类型创建并初始化初始化表达式类型的左值。销毁该临时对象,在与绑定后销毁的对象的引用。 |