【问题标题】:constructor vs destructor environment assemble构造函数与析构函数环境组装
【发布时间】:2012-11-12 05:52:28
【问题描述】:

构造函数为成员组装执行环境 自下而上的类函数(成员优先)。这 析构函数从上到下(成员最后)对其进行反汇编。

[来自 C++ 编程语言]

请问有人能描述一下吗?我知道成员函数在这里是指类的成员函数,但是“成员”首先是什么?这与堆栈上的功能有关吗? “组装执行环境”是什么意思?

【问题讨论】:

    标签: c++ constructor destructor


    【解决方案1】:

    这句话很抽象。 成员函数的执行环境是类本身的成员和基类之一公开的成员。

    大概,所谓“组装执行环境”,就是初始化类的所有成员和基类(注意成员函数不需要初始化)。

    我不明白这与堆栈上的对象有什么关系。

    一个例子:

    class X {
    public:
      X() // constructor initializes first a, then b, then c
      {
        // members are now accessible for member functions
        foo();
      }
    
      void foo() {
        // member function executes in the context of an object
        // a, b, and c mean this->a, this->b and this->
        std::cout << a << b << c << std::endl;
      }
    
      ~X() {} // destroys first c, then b and then a 
    private:
      int a;
      double b;
      char c;
    };
    

    请注意,您不需要在 上述情况。这只是为了示范的目的。

    【讨论】:

    • 请注意,“成员函数不需要初始化”并不完全正确。虚拟成员确实需要初始化,否则它们不能被调用。实际上,您可以通过从子类的构造函数中调用虚函数来看到正在讨论的效果。类 A 派生自类 B,然后调用 B::func() 假设 func() 是一个虚函数应该调用 A::func(),但是在运行 B::B() 时不是这种情况,因为 func()仍然只是指向 B::func() 的指针,还不是指向 A::func() 的指针。同样,在 B::~B() 中调用 B::func() 不会调用 A::func()!
    • @AlexisWilke 好点,我害怕在这里提出这个问题,因为这会让事情变得更加混乱。
    【解决方案2】:

    意思是在构造函数中,先构造类的成员子对象,然后再运行构造函数的主体。使用析构函数则相反。首先析构函数的主体运行,然后成员子对象被销毁。

    “成员函数的执行环境”只是可以通过定义的行为调用成员函数的环境。该环境是成员子对象是有效构造对象的环境。所以“为成员函数组装执行环境”,就是运行构造函数。这只是华丽的语言。

    【讨论】:

    • 没有。这是真的,但正如你在书中所说的那样,它几乎是逐字逐句地描述的。然后添加有关 assemble 的附加信息。所以这是更多
    • @cf16:construct=assemble,destruct=destroy=disassemble
    • 我不认为有平等。我认为这可能令人困惑。有什么理由首先说明它的进展情况,然后用“assemble”代替construct 重写它
    • @cf16 使用assembledisassemble 的描述更加抽象,可能是为了提供更高层次的视图。语言规范中没有提到执行上下文之类的东西。
    • 没错,但这不是诗,而是关于编程的书。对我来说,这可能会让人感到困惑,因为我开始思考 assemble 的作者是什么意思,所以可能是堆栈上的汇编和布局 - 这就是我正在考虑的内容
    【解决方案3】:

    我认为“成员”是指变量,所以在类上调用构造函数时,它首先创建变量,然后为类对象的执行功能设置环境,因为它们可能依赖于成员变量。

    函数的“组装执行环境”是指先初始化成员变量,以便在成员函数中调用。

    而析构函数首先销毁类对象所有函数的环境,然后销毁成员变量。

    【讨论】:

      猜你喜欢
      • 2013-07-07
      • 2014-05-27
      • 2011-04-16
      • 2011-04-03
      • 2010-12-16
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多