c ++将相同的Object返回给调用者

时间:2014-07-09 21:40:05

标签: c++ destructor

我有以下代码,

    ---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

我只需要调用一个析构函数。

2 个答案:

答案 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_ptrunique_ptr管理此对象。)