コンストラクターはおそらく悪い名前です。実際には、事前に構築されたオブジェクトの初期化子です。これを説明する最も簡単な方法は、C++ コンストラクターを使用しない同等の構成の疑似例です。
コンストラクター付き
struct X {
int a;
X() {
a = -5;
}
};
int main() {
X* x1 = new X(); // X created as a "reference object".
X x2; // X created as a "value object" on the stack.
return x1->a - x2.a;
}
コンストラクタなし
struct X {
int a;
void initialize() {
a = -5;
}
static X* create() {
X* res = (X*)malloc(sizeof(X));
res->initialize();
return res;
}
};
int main() {
X* x1 = X::create(); // New constructed heap-allocated X
X x2; // Stack-allocated X
x2.initialize(); // Manually initialized
return x1->a - x2.a;
}
X::initialize
ここで、2 番目の例で、たとえばbool
成功または失敗を示して返されると想像すると、問題が発生します。ではmain()
、注意を怠ったプログラマX
は が正しく初期化されず、未定義の動作につながる可能性があります (通常、本番環境の前に発見されない可能性がある、デバッグが困難なクラッシュです)。
これが、コンストラクターが特別な理由の 1 つです。コンストラクターを終了する唯一の 2 つの方法は、通常の完了または例外によるものであり、呼び出し元によって処理される (またはスタックに渡される)必要があります。いずれにせよ、初期化されていないオブジェクトで終わるのを防ぎます。
補足として、初期化されていないオブジェクトは、C のバグのより一般的な原因の 1 つであり、このようなプログラマーを支援するものは何もありません。