★メンバ変数の初期化★


メンバ変数の初期化方法について説明します。

本編では、コンストラクタ関数を使った、初期化リストでの初期化を紹介しました。

その他の方法と初期化リストについてももう少し書きます。


コンストラクタ関数を使わない方法


最初は、コンストラクタ関数を使わない方法について説明します。

先にプログラムを書きます。

<sample program col_cpp001-01>

#include <iostream>

class ATM {
public:

    void ShowBallance() const;

private:

    int m_balance = 0;
};

int main()
{
    ATM ufj;

    ufj.ShowBallance();
    
    return 0;
}

void ATM::ShowBallance() const
{
    std::cout << "残高は" << m_balance << "円です。" << std::endl;
}

<実行結果>

残高は0円です。
続行するには何かキーを押してください・・・

メンバ変数の宣言時にそのまま初期値を入れる方法です。

この方法は、昔のVisual Studioではエラーになっていました。

しかし、少し前からエラーにならず使えるようになっています。


初期化リストを使わない方法


次はコンストラクタ関数は使いますが、初期化リストを使わない方法です。

<sample program col_cpp001-02>

#include <iostream>

class ATM {
public:

    ATM();

    void ShowBallance() const;

private:

    int m_balance;
};

int main()
{
    ATM ufj;

    ufj.ShowBallance();
    
    return 0;
}

ATM::ATM()
{
    m_balance = 0;
}

void ATM::ShowBallance() const
{
    std::cout << "残高は" << m_balance << "円です。" << std::endl;
}

<実行結果>

残高は0円です。
続行するには何かキーを押してください・・・

コンストラクタも関数ですから、括弧の中にプログラムを書く事が出来ます。

そこで初期値を代入する方法も使えます。


上で紹介した2つの方法でも初期化は出来ますが、初期化リストを使う方法がより良い選択肢ですので、本編では初期化リストを使います。


初期化リストの注意点


最後に初期化リストの注意点を書いておきます。

<sample program col_cpp001-03>

#include <iostream>

class Sample {
public:

    Sample();

    void ShowValue() const;

private:

    int m_valueA;
    int m_valueB;
};

int main()
{
    Sample sample;

    sample.ShowValue();

    return 0;
}

Sample::Sample() : m_valueB(5), m_valueA(m_valueB)
{
    
}

void Sample::ShowValue() const
{
    std::cout << "valueA = " << m_valueA << std::endl;
    std::cout << "valueB = " << m_valueB << std::endl;
}

<実行結果>

valueA = -858993460
valueB = 5
続行するには何かキーを押してください・・・

初期化リストを見てください。

Sample::Sample() : m_valueB(5), m_valueA(m_valueB)
{
    
}

「m_valueB」を先に初期化して、「m_valueA」は先に初期化した「m_valueB」を使って初期化しました。

しかし、実行結果を見ると「m_valueA」は初期化されていません。

これはメンバ変数の宣言順に関係があります。

メンバ変数の宣言は、「m_valueA」 → 「m_valueB」の順番で宣言されています。

初期化リストはメンバ変数の宣言順に初期化を行うのです。

メンバ変数の宣言順に初期化リストで初期化しなければ、値が入っていない状態になります。


ブラウザの戻るボタンで戻ってください。