第58章 構造体

 今回はC++プログラミングで非常に重要なクラスの前身とも言うべき構造体について話します。いろいろな変数をひとまとめに扱うというもので、様々なところで使うことになるでしょう。


 では、今回の要点です。


 では、いってみましょう。


 さて、話は第15章にさかのぼります。生徒の成績を配列変数で扱いましたね。今回はもっといろいろなデータを同時に扱うことにします。

 先ずは名前で、そして国語、数学、英語の成績を扱いたいと思います。今までなら、

const int NUMOF_STUDENTS = 40;
char      szName[NUMOF_STUDENTS][16];
int       nJapanese[NUMOF_STUDENTS];
int       nMath[NUMOF_STUDENTS];
int       nEnglish[NUMOF_STUDENTS];

 とするところですね。しかし、このようにバラバラに扱うと、例えば各個人の成績の和を求める関数を作ろうとしたとき、

int Sum(int nJapanese, int nMath, int nEnglish)
{
    return nJapanese + nMath + nEnglish;
}

という風に3つもの引数をとる必要があります。(ただし、変数は全て内部変数第9章参照)とします。これはC++プログラムではよくあることです。)

 これが、各生徒のデータを表示する関数となると、4つもの引数をとる必要があります。こういうことは面倒であると同時に、各データの関係が有機的に繋がってきません。

 これらのデータは生徒のデータという点で共通しているので、これらのデータを生徒のデータという新しい型を作って扱えれば便利ですね。これを実現するのが構造体です。


 構造体は、次のように宣言します。

struct SStudent
{
    char szName[16];
    int  nJapanese;
    int  nMath;
    int  nEnglish;
};

 このように、

struct <名前>
{
    <変数宣言群>
};

とすると、これらの変数をひとまとめに宣言できるような型を作成することができます。(最後のセミコロンは忘れやすいので注意して下さい。)

 szName など、構造体の要素はメンバ(member)と呼ばれます。szName は変数なので、特にメンバ変数と呼ばれます。

 ここで注意することは、これはを作成しただけであって、まだ変数は宣言してはいないということです。このことは非常に重要です。


 では、変数を作成してみましょう。

SStudent student;

 普通の変数の宣言と全く変わりませんね。

 C言語では struct SStudent student; という形にしなければなりませんでしたが、C++ではこの制限は無くなりました。

 このように、「型」と「変数」は別な物です。変数となって初めてメモリ上に現れます。型は実行ファイル上では形のない物であり、型を操作するというのはナンセンスです。このことを踏まえて、メモリ上に存在しているある型の変数のことを、その型の「実体(インスタンス)」と呼びます。

 また、構造体は意味のある情報のかたまりであるので、構造体変数のことを物に見立てて「オブジェクト」とも呼びます。


 で、あとはメンバの使い方です。

cout << "名前 : "   << student.szName    << endl
     << " 国語 : " << student.nJapanese << " 点, "
        "数学 : "   << student.nMath     << " 点, "
        "英語 : "   << student.nEnglish  << " 点" << endl;

 このように、

<オブジェクト>.<メンバ>

とすると、メンバを操作することができます。簡単ですね。

 ついでですが、文字列を複数行に分けて書きたいときは、

char str[] = "文字列1"
             "文字列2";

のように、文字列を2つ書くだけで構いません。これは別に複数行にしなくても問題ありません。

char str[] = "文字列1" "文字列2";

 ヌルターミネータは、最後の文字列にだけ付きます。


 今回はこれで終わりです。では、今回の要点です。


 今回は構造体の説明だけにしておきました。次回は、構造体を実際に使ってみます。

 では、次回まで。


第57章 身長いくら?2 | 第59章 構造体2

Last update was done on 2000.7.8

この講座の著作権はロベールが保有しています