我有以下代码,
---file1.cpp---
file1::file1()
{
std::cout<<"Inside constructor \n";
}
file1::~file1()
{
std::cout<<"Inside destructor \n";
}
---file2.cpp---
//file2 is a singleton. There is a single object instance available at anytime.
file1 file2::cFunction()
{
file1 f1();
return f1;
}
----mainFile.cpp----
int main()
{
file2 o1;
file2 o2;
file1 obj1 = o1.cFunction();
file1 obj2 = o2.cFunction();
return 0;
}
头文件定义了file1.h和file2.h中的类(同样file2是单例),我已根据需要包含它们。(没有在这里复制这些内容)。
所以我的要求是这样的,当我调用o1.cFunction()时,它会创建一个file1对象并将其返回给obj1(作为副本)。相反,我想创建一个对象并返回到obj1。
现在,o1.cFunction()会打印, 在COnstructor内部//来自cFunction 在析构函数内部//来自cFunction 在析构函数内部//来自main
我只需要调用一个析构函数。
答案 0 :(得分:0)
允许编译器忽略
中f1
的副本
file1 file2::cFunction()
{
file1 f1;
return f1;
}
这是允许的优化,而不是必需的行为。但是,该标准还指定如果编译器选择不执行复制省略,则必须首先将返回的值绑定到移动构造函数(即使它不是rvalue)。这将确保您至少获得f1
的移动。换句话说,您已经完成了您想要的代码。请注意,所有这些都假设是C ++ 11。它不适用于C ++ 03或更早版本。
答案 1 :(得分:0)
你的请求是编译器可以做的优化,但没有办法强迫他们这样做。
通常,您的行file1 obj1 = o1.cFunction();
可能会立即打印2个析构函数(f1
加上返回值),并在obj1
超出范围时调用第三个析构函数。
如果要防止复制,则必须使用与按值返回对象不同的模式。例如,cFunction
可以填写通过引用收到的参数;或者您可以返回指向new
'd对象的指针(最好使用shared_ptr
或unique_ptr
管理此对象。)