コンストラクターは、クラスのメンバー関数の実行環境を下から上にアセンブルします(メンバーを最初に)。デストラクタはそれを上から下に分解します(メンバーは最後)。
[C++プログラミング言語から]
誰かがこれを説明できますか?メンバー関数とは、ここではクラスのメンバー関数を意味することを理解していますが、最初に「メンバー」とは何ですか?これはスタック上の機能に関連していますか?「実行環境を組み立てる」とはどういう意味ですか?
コンストラクターは、クラスのメンバー関数の実行環境を下から上にアセンブルします(メンバーを最初に)。デストラクタはそれを上から下に分解します(メンバーは最後)。
[C++プログラミング言語から]
誰かがこれを説明できますか?メンバー関数とは、ここではクラスのメンバー関数を意味することを理解していますが、最初に「メンバー」とは何ですか?これはスタック上の機能に関連していますか?「実行環境を組み立てる」とはどういう意味ですか?
つまり、コンストラクターでは、クラスのメンバー サブオブジェクトが最初に構築され、次にコンストラクターの本体が実行されます。デストラクタの場合は逆です。最初にデストラクタの本体が実行され、次にメンバー サブオブジェクトが破棄されます。
「メンバー関数の実行環境」とは、定義された動作でメンバー関数を呼び出すことができる環境です。その環境は、メンバー サブオブジェクトが有効な構築オブジェクトである環境です。つまり、「メンバ関数の実行環境を組み立てる」とは、コンストラクタを実行することです。それはただの花言葉です。
文章はかなり抽象的です。メンバー関数の実行環境は、クラス自体のメンバーと、いずれかの基本クラスによって公開されるメンバーです。
おそらく、「実行環境をアセンブルする」とは、クラスのすべてのメンバーとベースを初期化することです (メンバー関数は初期化する必要がないことに注意してください)。
これがオブジェクトがスタック上にあるかどうかにどのように関係するかはわかりません。
例:
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;
};
上記の場合、デストラクタを書き出す必要はないことに注意してください。これは、ここでは例示的な目的で行われています。
「メンバー」は変数を意味すると思うので、クラスでコンストラクターが呼び出されると、最初に変数が作成され、次にクラスオブジェクトの実行関数の環境がセットアップされます。メンバー変数に依存する可能性があるためです。
関数の「実行環境を組み立てる」とは、メンバー変数が最初に初期化されることを意味するため、メンバー関数で呼び出すことができます。
一方、デストラクタは最初にクラス オブジェクトのすべての関数の環境を破棄し、次にメンバー変数を破棄します。