ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
オブジェクト指向のはなし

構造体の初期化が自動でイイ

用語
このトピックでは次の用語を覚えます:
  • コンストラクタ (constructor)
解説

ひとつ前のトピックで取り上げた複素数型 Complex は、普通に(auto 変数として)使うと不定な初期値が入ってしまいます。望ましくは、初期値としてゼロが入っていて欲しいでしょう。C++ では、構造体の初期値を与えるための関数「コンストラクタ」を記述することができます。

コンストラクタは通常の関数とは違う場所に定義します。それは、構造体の内側です。構造体の内側で定義された関数のことを、メンバ関数と言います。

実は、メンバ関数はいくらでも定義できます。そのうち構造体と同じ名前のものがコンストラクタとなります。

SAMPLE CODE
#include <iostream.h>

struct Complex {
    Complex() {
        m_nRe = 0;
        m_nIm = 0;
    }
    
    int m_nRe;
    int m_nIm;
};

void main()
{
    Complex C;
    
    cout << "Re=" << C.m_nRe << endl;
    cout << "Im=" << C.m_nIm << endl;
}


実行結果:
Re=0
Im=0

コンストラクタはパラメータをとることもできます。複素数型 Complex の場合は、「パラメータなしならゼロで初期化され、パラメータ1つなら実部にだけ代入して虚部はゼロとし、パラメータ2つなら実部・虚部それぞれに代入する」というパターンが望ましいでしょう。そこで、パラメータの省略テクニックを併用して、次のようにします。

SAMPLE CODE
#include <iostream.h>

struct Complex {
    Complex( int nRe=0, int nIm=0 ) {
        m_nRe = nRe;
        m_nIm = nIm;
    }
    
    int m_nRe;
    int m_nIm;
};

void main()
{
    Complex C0;
    Complex C1( 123 );
    Complex C2( 123, 456 );
    
    cout << "C0.Re=" << C0.m_nRe << endl;
    cout << "C0.Im=" << C0.m_nIm << endl;

    cout << "C1.Re=" << C1.m_nRe << endl;
    cout << "C1.Im=" << C1.m_nIm << endl;

    cout << "C2.Re=" << C2.m_nRe << endl;
    cout << "C2.Im=" << C2.m_nIm << endl;
}


実行結果:
C0.Re=0
C0.Im=0
C1.Re=123
C1.Im=0
C2.Re=123
C2.Im=456

(「オブジェクト指向のはなし」は1999年2月から2000年4月にかけて作成されたコンテンツです。)