09/03/09 23:19:34 2qC8QqlY
>>774
遅レスだがコンストラクタについて幾つか書きます。
さすがに長文書いてコメントが無いのは可哀想だったから。
昔の言語仕様ではコンストラクタではインスタンスの生成途中であるから複雑な処理を書かないようにしていた。これは慣習・慣例の部類の話。
コンパイラの亜種が多くて、C++の仕様外の範疇での動作はどのようになっているのか分からない時代だったからという背景もある。
自分はコンストラクタに初期化処理を噛ませる横着な書き方をしていたときに先輩に指摘された事は、1,2,3以外にも、、、
・クラス設計者とクラス利用者は同じでない
⇒利用者がstaticで外部変数なインスタンスを生成するかもしれないから、
mainよりも先に呼ばれる処理に複雑な記述を置くべきでない。
つまり、利用者の立場になって明示的に初期化処理を宣言するべき。(手を抜くな)
・戻り値を持たない件に関して、例外処理を使うのは怠惰な手段である。
⇒try-catchを用いるのは、デバッグの最終手段である。(例外処理はネストできない為)
例外処理は一般的にコンパイラの最適化の阻害となり遅くなる要因となる。(ジャンプテーブルを生成する為)
つまり、保持値チェックにはassert使えというお話。
⇒メモリ確保に失敗する危険性をもっと認識するべき
特定のハードウェアを対象にする場合、大概は独自のメモリアロケーター(dlmalloc等)を実装していることが多く、
new失敗の可能性(インスタンス生成失敗)は大いにある。
とのことでした。
>問題点は、
>「このような状態で他のクラスのインスタンスのメンバ関数を読んだりすると巡り巡ってまだ生成途中の自分自身のメンバ関数が呼ばれるかもしれないから」
>との事です。
これには同意です。
だから「コンストラクタに記述するのはせいぜいメンバ変数に対して初期値の代入ぐらい」に留めている人が大半で自分もそうしています。
いや~、バグの無いプログラムって難しいですね。