Herb Sutterは、コンストラクターがcompletees.ieを実行して、最終的な方法でコントロールを最終的なブレースに渡す場合にのみ、オブジェクトが構築された(有効な存在を持つ)アーティクルの1つを示します。コンストラクターでメソッドを呼び出す
今ハーブが言うから
class A
{
public:
A()
{
f();
}
void f()
{
cout << "hello, world";
}
};
int main()
{
A a;
}
ここで、次のコードを検討し、我々はAが完全に()コンストラクタを呼び出すF内に構築されていないため、コンストラクタの内部では、「このように無効であると言うことはできません"ptrはまだ準備ができていません。
実際には、コンストラクタ内に有効な「this」があり、f()が呼び出されます。
私はハーブが間違ったことを言っているとは思っていませんが、間違って解釈していると思います。
ここに記事へのリンクがあります:http://www.gotw.ca/gotw/066.htm コンストラクタからの例外について説明しています。具体的にはここに私の質問に基づいてそれから抽出されます:
- オブジェクトの生涯は始まるのですか? コンストラクタが正常に完了し、通常を返します。つまり、コントロールはコンストラクター本体の末尾または以前のreturnステートメントに到達します。
-オブジェクトの寿命が終わるのはいつですか? デストラクタが開始されるとき。つまり、コントロールはデストラクタ本体の先頭に到達します。 ここでの重要な点は、オブジェクトの存続期間が始まる前の状態が、オブジェクトの存続期間終了後とまったく同じであることです。期間はです。この観察は重要な問題に私たちをもたらします:
次のように私たちは、C++のコンストラクタモデルをまとめるかもしれません:
今Either:
(a) The constructor returns normally by reaching its end or a return statement, and the object exists.
Or:
(b) The constructor exits by emitting an exception, and the object not only does not now exist, but never existed.
だ場合は、「あなたが慎重にハーブサッターの記事を読んでいないようです。」 - あなたはまだ記事に手を置くことができないと考えて少し厳しいです... – razlebe
@sgreeve:厳しい?どうして? – Nawaz
OPが記事を慎重に読んでいないと仮定しています。記事を見ることなく、あなたは状況をよく説明したかどうかは分かりません。 – razlebe