Path: chuka.playstation.co.uk!news1.scei.co.jp!usenet From: "Sugihara Yoshimi" Newsgroups: playstation.ny.program.labo Subject: Re: GCC++の初期化ついて Date: 27 Apr 1997 17:24:49 GMT Organization: PlayStation Net Yarouze Lines: 106 Message-ID: <01bc532f$cb5d7800$5e10dbca@default> References: <01bc4ff3$89f95f80$5410dbca@default> <01bc5059$ac5515e0$9d36d4ca@pbc00426.niftyserve.or.jp> <01bc50c8$3278f380$LocalHost@default> <3360DB0F.AA74F82A@aix.or.jp> <33637B25.360F29F4@aix.or.jp> NNTP-Posting-Host: 202.219.16.94 X-Newsreader: Microsoft Internet News 4.70.1157 Sugihara です。 > >で,その後ちょっと調べたらメンバ変数の初期化は次のようにする > >のがC++風のようです。 > > > >class test > >{ > >public: > > long b; > > long c; > > > > test(int i=0,int j=0) : b(i),c(j){ } > >}; > > > なんか思いっきり勘違いされてる様な・・ > > 「 : ほにゃらら〜」の部分は、基底クラスに引数を渡す時に > 使用します。こんな感じ > > class base > { > int i; > public: > base(int x) { i = x; } > }; > > class test : pubic base > { > int j; > pulibc: > test(int x, int y) : base(y) { j = x; } > }; 「メンバ変数の初期化」の方法についてですが、高田さんの方法が間違っていると いうわけではないと思います。実際高田さんの方法でも期待した通りの結果が得ら れます。(結果オーライというわけです。) ただし、高田さんが示された方法と、私が示した方法は、メンバ変数の初期化を行 う方法が異なります。  コンストラクトしたクラス(ここでは、testクラス)の初期化を行う前に、「基 底クラス」や「メンバ変数」の初期化(要はコンストラクトするクラスが持ってい る変数をコンストラクトする)が行われますが、高田さんが示されたように「 : ほにゃらら〜」で初期化したときは、「基底クラス」や「メンバ変数」の初期化を おこなうコンストラクタに引き渡されます。  私が行っている方法では、「基底クラス」や「メンバ変数」の初期化をデフォル トコンストラクタで行い、その後に設定したい値を「代入」する事になります。 言葉では、分かりにくいと思いますので、以下のソースコードを実行してみてくだ さい。 class TESTA { public: int m_a; TESTA(const int i=0){ printf("TESTA::TESTA()¥n");this->m_a=i; } operator=(const int i){ printf("TESTA::operator=()¥n");this->m_a=i;} }; class TESTB { public: int m_b; TESTB(const int i=0){ printf("TESTB::TESTB()¥n");this->m_b=i; } operator=(const int i){ printf("TESTB::operator=()¥n");this->m_b=i;} }; class TESTC { public: TESTA m_testa; TESTB m_testb; TESTC(const int i=0,const int j=0):m_testa(i){this->m_testb=j;} }; void main(void) { TESTC c; } このソースコードを実行すると、画面上に TESTA::TESTA() TESTB::TESTB() TESTB::operator=() と表示されると思います。 このように「 : ほにゃらら〜」に記述したのと、コンストラクタの処理中に代入 するのとではこのように違います。  この結果から分かるように「: ほにゃらら〜」に記述した方が良いことになりますが、 「 : ほにゃらら〜」に記述すると「コンストラクタ」に渡すという処理の内容から、コ ンスト ラクタを持っていないクラスや基本的な変数型( int や long といったもの)には、使用してはいけないと思います。(高田さん の方法でも初期化できるということは、全くだめというわけではないみたいですけ ど)  長い上にわかりにくい文章になってしまいましたが、以上のことから、基本的な 変数型には「 : ほにゃらら〜」に記述しない方法が妥当であると考えています。