OBJ 应该在函数调用结束时被销毁'f'
the obj should have been destroyed at the end of function call 'f'
对象应该在函数调用'f'结束时被销毁,返回的对象应该是一个新对象。我应该两次收到"正在破坏"的信息。
#include <iostream>
using namespace std;
class c{
int i;
public:
~c(){cout<<"Destroying"<<endl;}
c(){cout<<"Constructing"<<endl;}
c(const c &a){cout<<"Copy Constructing"<<endl;}
int get_i(){cout<<i<<endl;return i;}
void set_i(int i){this->i=i;}
};
c f(){
c obj;
obj.set_i(1);
return obj;
}
int main() {
f().get_i();
return 0;
}
这被称为返回值优化(NRVO)。删除不必要的对象副本是一种优化。对象obj
在函数的返回值中被直接构造。
在一些情况下明确允许省略副本,包括:
在具有类返回类型的函数中的返回语句中,当表达式是与函数返回类型相同的非易失性自动对象(函数或catch子句形参除外)的名称时,可以通过直接将自动对象构造为函数的返回值
来省略复制/移动操作。
相关文章:
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 返回指向对象的指针的函数调用是否为 prvalue?
- mfc应用程序结束后,CMainFrame的析构函数调用发生访问冲突
- 为什么析构函数在对象引用作为参数传递时函数范围结束后调用
- 在块程序结束时析构函数调用的顺序
- OBJ 应该在函数调用结束时被销毁'f'
- 为什么方法调用结束复制构造函数