我必须加深对构造函数调用情况的理解。在此期间,我偶然发现了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;
  • 在MyMethod中,constructor称为RVO rvo;
  • 对于return (rvo);copyconstructor称为
  • 在MyMethod中,为本地RVO调用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/

    10-12 00:23