c++ - 析构函数和构造函数调用,示例对吗?

标签 c++ constructor

我必须加深对调用构造函数的情况的理解。在此期间我偶然发现了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 和析构函数在调用时打印。微软表示,如果 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

但是我不太明白。我认为这就是发生的事情:

  1. 主要constructor被要求 RVO rvo;
  2. 在我的方法中constructor被要求 RVO rvo;
  3. 对于return (rvo); copyconstructor被称为
  4. 在我的方法中destructor被要求本地 RVO
  5. 主要 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的返回对象分配,返回对象应该在main函数的范围内构造。该对象未命名,是一个临时对象。这种对象的构造函数显示在输出中,乍一看并不明显。

关于c++ - 析构函数和构造函数调用,示例对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12489781/

相关文章:

C++如何使用相同的函数两次使用不同的名称和变量的不同名称

c++ - "error: expected constructor, destructor, or type conversion before ' ( ' token"在 memset 调用的位置

java - 创建一个类,开始使用OOP。 java程序不显示任何内容?

c++ - 在构造函数中从 std::istream 初始化 const 类数据成员

c++ - 继承带有默认参数的构造函数?

java - 在Java中初始化后分配长度给数组?

c++ - 尽管设置了最小值,QDoubleSpinBox 不允许负值

c# - 如何将 C++ dll printf 导入到 C# 文本框

c++ - 后缀评估,为什么推送函数不更新堆栈变量的顶部?

c# - 派生类中复杂对象的类型转换