中村です。

At 31 Aug 2002 02:54:47 -0700 Dairyo Gokan wrote:
> > メンバ初期化子が使えないので場面によっては上手くいかない or 
> > パフォーマンスに問題がでるということがありますね。
> --------

> 具体的に問題になりそうなコードが思い当たらんですが...。

説明が足りなかったでしょうか。
例えば、メンバ変数に参照が含まれていた場合、メンバ初期化子でしか初期化でき
ませんから、init()では行えません。また、init()を使用した場合、全てのメンバ
変数がデフォルトコンストラクタで初期化してから代入することになるので、メン
バ初期化子で初期化するのに比べるとパフォーマンスが低下することがあります。

> それと、「コンストラクタ」は、完全なオブジェクトのインスタンス
> へのポインタを返すか、オブジェクトの初期化に失敗したらNULLポイ
> ンタを返すか、例外をスローするのが決まりです。

本題と関係ないですが、コンストラクタは何も返せない気がしますが。。返せるの
はnew演算子ですよね。


> 「コンストラクタ[A]」内から呼ばれる下請けの「コンストラクタ[B]」
> ってのは、直接呼び出された場合、不完全なオブジェクト(コンストラ
> クタ[A]でのみ初期化されるメンバが不定)を返すことになるはずで、
> オブジェクトの仕様定義そのものに問題があると思えます。

コンストラクタ[B]も普通のコンストラクタなのです。[A]から必要な計算などをし
た後で[B]を呼びたいだけで。


> コンストラクタの引数にデフォルト値を指定できればいいんでしょう
> けど、そうしたらコンパイラは、引数なしのコンストラクタと、デフ
> ォルト値を省略したコンストラクタを区別できなくなるし、かといって
> 明示的にコンパイラにデフォルトのコンストラクタを指定する記述子
> を新たに定義すると、省略するはずの手間が逆に増えてしまうし。

コンストラクタにデフォルト引数はしていできますよね?
ちょっと例が良くなかったでしょうか。。

struct A
{
  A(const std::string& s) : s_(s) {}
  A(const std::string& x, const std::string& y) : A(x + y) {}
  std::string s_;
};

みたいなことができればいいなと。メンバ変数が少なければそれぞれのコンストラ
クタでメンバ初期化子を書けば良いですが、メンバが多くなってくると、面倒だし
一つのコンストラクタを修正するのを忘れちゃったりしますよね。


> どっちにしろ、タブや括弧のインデント同様、ソース記述上の下らん
> こだわりに過ぎんと思います。

後神さんがそう考えるのは別に構いませんが、まったく別の話だと私は思います。

---
Satoshi Nakamura <s...@zak.att.ne.jp>