C++メンバイニシャライザリストの書き方とは?

このQ&Aのポイント
  • C++のメンバイニシャライザリストでは、メンバ変数を初期化する値をかっこ内に書くことができます。
  • 例えば、クラスToken_streamのコンストラクタではfullとbufferの初期化が行われています。
  • buffer(0)は、Token型のオブジェクトを0で初期化することを意味しています。
回答を見る
  • ベストアンサー

C++ メンバイニシャライザリストについて

メンバイニシャライザリストのかっこの中に値を書くと、その値でメンバが初期化されるそうですが、かっこの中には、そのメンバのコンストラクタの引数以外も書くことができるのでしょうか? 例えば以下のようなクラスを考えます。 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で初期化できるのでしょうか?

  • koun
  • お礼率37% (81/216)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> ではどうしてbuffer('0')と書かないのですか? 意味が違います。buffer('\0') なら同じことになりますが。

koun
質問者

お礼

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

その他の回答 (3)

回答No.4

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;

koun
質問者

お礼

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

  • nondaku0
  • ベストアンサー率66% (10/15)
回答No.2

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

koun
質問者

補足

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

回答No.1

Tokenのコンストラクタにはこういうのがあるようですが... Token(char ch):kind(ch), value(0){} 例えば、 Token token(0); というのは上記のコンストラクタが処理してくれることを考えると、書けますよね。

koun
質問者

補足

試しに以下のようなプログラムを書いて実行してみました。 #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と表示されないのはなぜですか?

関連するQ&A

  • 配列であるメンバのコンストラクタを呼ぶ方法

    C++のクラスについて教えていただけないでしょうか。以下のような場合、 class ClassA {   int A; public:   ClassA(int a): A(a) {} }; class ClassB {   ClassA A; public:   ClassB(): A(10) {} }; class ClassC {   ClassA A[2]; public:   ClassC() {} //配列であるメンバのコンストラクタを呼び出したい }; ClassBがClassAのコンストラクタを呼ぶには上記のような方法で良いと思うのですが、ClassCのようにメンバが配列の場合、そのメンバのコンストラクタを呼ぶにはどのようにしたら良いのでしょうか。ご教授をお願いします。

  • int型のchar型への代入について

    VC++6.0のfgetcのヘルプに以下のようなコードが有りました。 int型のchをcharのbuffer[i]に代入するということに違和感を感じたのですが、 1.このようにする必要性とは何なのでしょうか? 2.このような代入により具体的には何が行われているのでしょうか? 3.そもそも1文字とりだすfgetcの戻り値がcharでなくintなのはなぜ? 質問が漠然としていて申し訳ありませんが、お願いします。  FILE *stream; char buffer[81]; int ch; 省略   stream = fopen( "fgetc.c", "r" )) 省略 ch = fgetc( stream ); 省略 buffer[i] = ch;

  • クラスがメンバーとしてクラスを持つ時の宣言について

    自作クラスMainClassがMyClassというクラスをメンバー変数として持つ場合、宣言時に引数をいくつか持つコンストラクタを呼び出そうとすると構文エラーとなります。 class MyClass { public: MyClass(int, int); } class MainClass { private: MyClass myclass(10,10); } このような宣言はできないのでしょうか。 引数なしのコンストラクタは呼び出せているようです。

  • c++について

    入力した値が123または456で一致したら一致と表示したいのですがどうfor文を回すか分かりません。 ご助力願います_(._.)_ class N { bool hit(const char* a[],const char* b) {   for(int i=0;i<*a[i];i++) if(*a[i]!=b[i]) { return false; } return true ; } public: N() { const char* a[ ]={ "123","456"}; char b[4]; int num; cin>>num; sprintf_s(b, 4, "%03d", num); if(hit(a,b)) cout<<"一致"; else cout<<"不一致"; } };

  • インスタンス化したクラスを関数に渡したい

    class GAMMA { public: //コンストラクタ GAMMA(); int SetGammaValue(int value) { gamma_kind=value; return 0; } private: int gamma_kind; }; GAMMA gamma;//インスタンス化 この後に、このインスタンス化した「gamma」を Function(gamma)の様に関数渡しをしたいのですが、 うまくいきません。 そもそもclassは関数渡しできるのでしょうか? 構造体は関数渡しできるのは確認済みなのですが・・・。 関数部分は Function(class gamma) { } の様にすればいいのでしょうか?

  • メンバ変数の取得

    二次元の配列をメンバ変数の値を取得したいのですが、上手くいきません。 どなたか教えて頂けないでしょうか。 class DML_Backup {  char ecoFileList[256][32]; public: char GetsearchEcoDataFileName(){return **ecoFileList;} } void main() { DML_Backup m_ecoData; char ecoFileList[256][32]; **ecoFileList = m_ecoData.GetsearchEcoDataFileName(); }

  • constのついたメンバ関数

     こんにちは。 C++を勉強しているのですが疑問に思ったことがあります。 const指定したメンバ関数にメンバ変数の変更をすることはエラーになるはずなんですが、 下記にある(*m_pRefCnt)++; はコンパイルが通るようです。 なぜこの一文だけ通るのでしょうか? 以下にソースを添付しておきます。 #include <iostream> class hogeClass { private: int* m_pRefCnt; int val; void AddRef() const { (*m_pRefCnt)++; // これはOK? val = 100; // これは駄目 } void Release() { } public: explicit hogeClass(char* src = NULL) : val(0) { } int& GetRefCnt() { return *(m_pRefCnt); } virtual ~hogeClass() { Release(); } }; int main() { int c = 435, k = 222; using namespace std; hogeClass a; getchar(); return 0; } 分かる人がいたらよろしくお願いします。

  • クラス内で上位クラス内メンバの値を変更

    クラス内で上位クラス内メンバの値を変更 test2Objクラス内で test1Objメンバ内のtest1Valueの値を2に変えたい このような事は可能でしょうか? ================================ class Test2Obj{ public: void changeValue(){ //ここでtest1Objメンバ内のtest1Valueの値を2に変えたい } }; class Test1Obj{ public: int test1Value; Test2Obj *test2Obj; //コンストラクタ Test1Obj(int tmp_test1Value){ setTest1Value(tmp_test1Value); test2Obj=new Test2Obj(); } void setTest1Value(int tmp_test1Value){test1Value=tmp_test1Value;} }; int main(void){ Test1Obj *test1Obj=new Test1Obj(1); printf(">>>%d\n",test1Obj->test1Value); //ここでtest1Obj->test1Valueの値を変えたい test1Obj->test2Obj->changeValue(); } ================================ もしコードに問題があればご指摘をお願いします。

  • 派生クラスのメンバを基底クラスの参照に代入(C++

    文末のコードのように、 基底クラスで、派生クラスのメンバの参照を持つのはまずいでしょうか。 (classではなくstructにしているのは質問上でのpublic:の省略のためだけです) 初期化順序的には、基底クラスの参照先は、 基底クラスのコンストラクタが走る時点で初期化されていないので、 コンストラクタ内で参照に対して何かしようとすると問題になると思っています。 基底クラスのコンストラクタ内で派生クラスメンバの参照に対して何かしなければ、 参照は有効で、派生クラスのコンストラクタ実行後であれば 問題なく動くと思ってよいでしょうか。 struct A { int& m_ref; A(int& ref) : m_ref(ref) { } }; struct B : public A { int m_obj; B() : A(m_obj) { } };

  • C++ 静的クラスの役割が分からない

    こんばんは。 C++で静的オブジェクトがなんなのか試しにプログラミングしているんですが どんな役割があるのか試してもよく分かりません。 static class HOGE { public: int *hoge; private: int value[2]; char moji[6]; public: HOGE() { cout << "HOGE\n"; } void MOJI() { strcpy(moji, "MOJI\n"); } void TEST() { cout << "moji = " << moji << endl; } static void staticMOJI() { } }sObj; sObjからは静的メンバ関数と静的メンバ変数は呼び出せるようです。他は呼び出せません。 そのようにするためにstatic宣言をするものなのでしょうか? このsObjからメンバ変数(*hoge)を呼び出すことは無理なんでしょうか?

専門家に質問してみよう