dポイントプレゼントキャンペーン実施中!

メンバイニシャライザリストのかっこの中に値を書くと、その値でメンバが初期化されるそうですが、かっこの中には、そのメンバのコンストラクタの引数以外も書くことができるのでしょうか?

例えば以下のようなクラスを考えます。
class Token_stream{
public:
 Token_stream():full(false), buffer(0){}
 ・・・
private:
 bool full;
 Token buffer;
};

class Token{
public:
 char kind;
 double value;
 Token(char ch):kind(ch), value(0){}
 Token(char ch, double val):kind(ch), value(val){}
};

クラスToken_streamのコンストラクタのメンバイニシャライザリストはfull(false), buffer(0)となっていますが、full(false)はfullの型がboolだから理解できます。ところがbuffer(0)という記述が理解できません。bufferの型はTokenです。Tokenオブジェクトを0で初期化できるのでしょうか?

A 回答 (4件)

> ではどうしてbuffer('0')と書かないのですか?



意味が違います。buffer('\0') なら同じことになりますが。
    • good
    • 0
この回答へのお礼

ありがとうございます。理解できました。

お礼日時:2013/02/20 23:11

AAA(char ch):value(0){}


とchar型で入ってますよね?
そしたら、char型としてcoutには処理されますよね。

先程お書きになった
class BBB{
public:
 BBB():aaa(0){}
 AAA aaa;
};
のところを
class BBB{
public:
 BBB():aaa('a'){}
 AAA aaa;
};
と書いてみたらどうなりますか?

#3の回答通り、aaa(0)だと、文字コードの0で表現される文字である、ヌル文字が引数だと解釈されます。

よくわからないなら、これが何と表示されるかみてみると良いでしょう。
char c = 0;
cout << c << endl;

c = '0'だと0という文字の文字コード(ASCIIコードでは48)が代入されていて、
c = 0だと文字コード番号0の値であるヌル文字が代入されますので、
cに代入された値は異なります。

これもよくわからないならやってみると良いでしょう。
char c = '0';
cout << c << endl;
    • good
    • 0
この回答へのお礼

ありがとうございます。charに数を代入すると文字コードと解釈されるのですね。

お礼日時:2013/02/20 23:17

0で初期化されます。



buffer(0)と書いた部分はToken(char ch)が呼び出されるからです。

この回答への補足

回答ありがとうございます。ではどうしてbuffer('0')と書かないのですか?本(ストラウストラップのプログラミング入門)にはbuffer(0)と書いてありました。

補足日時:2013/02/19 23:13
    • good
    • 0

Tokenのコンストラクタにはこういうのがあるようですが...


Token(char ch):kind(ch), value(0){}

例えば、
Token token(0);
というのは上記のコンストラクタが処理してくれることを考えると、書けますよね。

この回答への補足

試しに以下のようなプログラムを書いて実行してみました。

#include <iostream>
using namespace std;

class AAA{
public:
 AAA(char ch):c(ch){}
 char c;
};

class BBB{
public:
 BBB():aaa(0){}
 AAA aaa;
};

int main(){
 BBB bbb;
 cout << bbb.aaa.c << '\n';

 return 0;
}

実行結果は改行が表示されただけでした。では、0と表示されないのはなぜですか?

補足日時:2013/02/19 23:34
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!