メンバ変数の初期化方法について説明します。
本編では、コンストラクタ関数を使った、初期化リストでの初期化を紹介しました。
その他の方法と初期化リストについてももう少し書きます。
最初は、コンストラクタ関数を使わない方法について説明します。
先にプログラムを書きます。
<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」の順番で宣言されています。
初期化リストはメンバ変数の宣言順に初期化を行うのです。
メンバ変数の宣言順に初期化リストで初期化しなければ、値が入っていない状態になります。
ブラウザの戻るボタンで戻ってください。