Satoshi Nakamura wrote:
> > 深く考えるほどの問題ではなく、初期化用に使う共通のメンバ関数を
> > 定義して、それを呼び出せば済む話なんでは?
>
> メンバ初期化子が使えないので場面によっては上手くいかない or
> パフォーマンスに問題がでるということがありますね。
--------
具体的に問題になりそうなコードが思い当たらんですが...。
『パフォーマンスに問題が出る』ってのは、どういうことでしょうか?
サブルーチンコールするオーバーヘッドが無視できなくなるには ...
(1) 関数に記述される共通処理がほとんどない
(2) サブルーチンコールが遅い(CALL命令実行にクロックを要する)
などが考えられますが、言語仕様上は関数ではなくても、実体として
のコンストラクタはコンパイラ内でネームスペースで特別扱いされた
関数に過ぎませんし、メンバ関数に限らず、サブルーチンを呼び出す
オーバーヘッドは、コンストラクタを呼び出すのと変わりません。
それと、「コンストラクタ」は、完全なオブジェクトのインスタンス
へのポインタを返すか、オブジェクトの初期化に失敗したらNULLポイ
ンタを返すか、例外をスローするのが決まりです。
「コンストラクタ[A]」内から呼ばれる下請けの「コンストラクタ[B]」
ってのは、直接呼び出された場合、不完全なオブジェクト(コンストラ
クタ[A]でのみ初期化されるメンバが不定)を返すことになるはずで、
オブジェクトの仕様定義そのものに問題があると思えます。
--------
> class A
> {
> public:
> A() : A(5) {}
> A(int n) { ... }
> };
>
> みたいなことって出来ても良いと思うんですが、なんで仕様にないん
> でしょうね?
--------
その必要性がないからでは?
コンストラクタの引数にデフォルト値を指定できればいいんでしょう
けど、そうしたらコンパイラは、引数なしのコンストラクタと、デフ
ォルト値を省略したコンストラクタを区別できなくなるし、かといって
明示的にコンパイラにデフォルトのコンストラクタを指定する記述子
を新たに定義すると、省略するはずの手間が逆に増えてしまうし。
どっちにしろ、タブや括弧のインデント同様、ソース記述上の下らん
こだわりに過ぎんと思います。
+---------------------------------------------------------------------+
| From : Dairyo Gokan ( 後神 大陵 ) mailto:g...@studio-nand.com |
| Org. : Studio NAND L.L.C. http://www.studio-nand.com |
| Adrs : 1820 154th Ave NE #D235, Bellevue, WA 98007 U.S.A. |
| TEL : (+1) 425-957-1047 FAX : (+1) 425-957-4603 |
+---------------------------------------------------------------------+
> > 深く考えるほどの問題ではなく、初期化用に使う共通のメンバ関数を
> > 定義して、それを呼び出せば済む話なんでは?
>
> メンバ初期化子が使えないので場面によっては上手くいかない or
> パフォーマンスに問題がでるということがありますね。
--------
具体的に問題になりそうなコードが思い当たらんですが...。
『パフォーマンスに問題が出る』ってのは、どういうことでしょうか?
サブルーチンコールするオーバーヘッドが無視できなくなるには ...
(1) 関数に記述される共通処理がほとんどない
(2) サブルーチンコールが遅い(CALL命令実行にクロックを要する)
などが考えられますが、言語仕様上は関数ではなくても、実体として
のコンストラクタはコンパイラ内でネームスペースで特別扱いされた
関数に過ぎませんし、メンバ関数に限らず、サブルーチンを呼び出す
オーバーヘッドは、コンストラクタを呼び出すのと変わりません。
それと、「コンストラクタ」は、完全なオブジェクトのインスタンス
へのポインタを返すか、オブジェクトの初期化に失敗したらNULLポイ
ンタを返すか、例外をスローするのが決まりです。
「コンストラクタ[A]」内から呼ばれる下請けの「コンストラクタ[B]」
ってのは、直接呼び出された場合、不完全なオブジェクト(コンストラ
クタ[A]でのみ初期化されるメンバが不定)を返すことになるはずで、
オブジェクトの仕様定義そのものに問題があると思えます。
--------
> class A
> {
> public:
> A() : A(5) {}
> A(int n) { ... }
> };
>
> みたいなことって出来ても良いと思うんですが、なんで仕様にないん
> でしょうね?
--------
その必要性がないからでは?
コンストラクタの引数にデフォルト値を指定できればいいんでしょう
けど、そうしたらコンパイラは、引数なしのコンストラクタと、デフ
ォルト値を省略したコンストラクタを区別できなくなるし、かといって
明示的にコンパイラにデフォルトのコンストラクタを指定する記述子
を新たに定義すると、省略するはずの手間が逆に増えてしまうし。
どっちにしろ、タブや括弧のインデント同様、ソース記述上の下らん
こだわりに過ぎんと思います。
+---------------------------------------------------------------------+
| From : Dairyo Gokan ( 後神 大陵 ) mailto:g...@studio-nand.com |
| Org. : Studio NAND L.L.C. http://www.studio-nand.com |
| Adrs : 1820 154th Ave NE #D235, Bellevue, WA 98007 U.S.A. |
| TEL : (+1) 425-957-1047 FAX : (+1) 425-957-4603 |
+---------------------------------------------------------------------+