我必须加深对构造函数调用情况的理解。在此期间,我偶然发现了Microsoft的this example:
//RVO class is defined above in figure 4
#include <stdio.h>
RVO MyMethod (int i)
{
RVO rvo;
rvo.mem_var = i;
throw "I am throwing an exception!";
return (rvo);
}
int main()
{
RVO rvo;
try
{
rvo=MyMethod(5);
}
catch (char* str)
{
printf ("I caught the exception\n");
}
}
RVO
类在调用时仅具有构造函数,copyconsdtuctor和析构函数打印。 Microsoft指出,在thorw被注释掉且没有NRVO的情况下,输出为:I am in constructor
I am in constructor
I am in copy constructor
I am in destructor
I am in destructor
I am in destructor
但是我不太明白。我认为这是发生了什么:
constructor
中被称为RVO rvo;
constructor
称为RVO rvo;
return (rvo);
,copyconstructor
称为destructor
destructor
中为本地rvo调用这给我留下了比微软宣称少的
destructor
调用。我想念什么?为了完善
RVO
类:class RVO
{
public:
RVO(){printf("I am in constructor\n");}
RVO (const RVO& c_RVO) {printf ("I am in copy constructor\n");}
~RVO(){printf ("I am in destructor\n");}
int mem_var;
};
最佳答案
如果仔细看一下语句rvo = MyMethod(5);
rvo由MyMethod的返回对象分配,该返回对象应在主函数的范围内构造。该对象未命名,是一个临时对象。这样的对象的构造函数显示在输出中,乍一看并不明显。
关于c++ - 析构函数和构造函数调用,示例对吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12489781/