今回は、前回話した構造体を実際に使ってみます。あまり話の進展はありませんが、重要なのでゆっくりやっていきます。
では、今回の要点です。
では、いってみましょう。
前回作った構造体がありました。これを実際に使ってみましょう。
早速ですが、次のプログラムを見て下さい。
| プログラム |
|---|
// Struct1.cpp
#include <iostream.h>
#define ELEM(array) (sizeof (array) / sizeof *(array))
struct SStudent
{
char szName[16];
int nJapanese;
int nMath;
int nEnglish;
};
void Disp(const SStudent& student)
{
cout << "名前 : " << student.szName << endl
<< " 国語 : " << student.nJapanese << " 点, "
"数学 : " << student.nMath << " 点, "
"英語 : " << student.nEnglish << " 点" << endl;
}
int main()
{
SStudent students[] = {
{ "赤井孝", 73, 98, 86, },
{ "笠井大介", 64, 45, 40, },
{ "吉田叶", 76, 78, 69, },
};
int i;
for(i = 0; i < ELEM(students); i++)
Disp(students[i]);
return 0;
} |
| 実行結果 |
名前 : 赤井孝 国語 : 73 点, 数学 : 98 点, 英語 86 点 名前 : 笠井大介 国語 : 64 点, 数学 : 45 点, 英語 40 点 名前 : 吉田叶 国語 : 76 点, 数学 : 78 点, 英語 69 点 |
先ず、ELEM というのがありますが、これは第57章でやった配列の要素数を取得するマクロですね。
で、その次に構造体の宣言があります。ここではまだ型を宣言しただけでしたね。まだ実体はどこにもありません。
そして、その次に SStudent への参照を引数にとる関数 Disp があります。普通の型の参照を引数にとる関数と、なんら変わらない構文ですね。関数内の処理も、前回の書いた処理のコピー&ペーストです(笑)。前回のことを思い出してもらえれば、何の特別なこともしていません。
このように、構造体はデータ量が多いので、配列と同じようにポインタや参照を使ってやりとりするのが普通です。
もし、これをポインタや参照にしていなければ、構造体がコピーされます。int とかと同じように、値渡し(第34章参照)になるわけですね。ここは配列と大きく違うところです。もし構造体のサイズが4000バイトだろうとも、4000バイトコピーされるわけです。これには注意して下さい。
ただし、小さい構造体なら値渡しの方が有利になる可能性があります。理由は難しいので詳しくは話せませんが、キャッシュが関係してくると言うことだけ言っておきます。でもその場合でも、参照渡しにする必要があるならもちろん参照渡しにします。
で、いよいよ main 関数です。
変数を作成しているのは、冒頭の
SStudent students[] = {
{ "赤井孝", 73, 98, 86, },
{ "笠井大介", 64, 45, 40, },
{ "吉田叶", 76, 78, 69, },
};
という所です。宣言自体は普通の配列変数の宣言と全く変わりませんね。
ここでは宣言と同時に初期化しています。構造体の配列を初期化するときは、1つ1つのオブジェクトに対しての初期化を書き連ね、それぞれを { } で囲みます。これは多次元配列でも同じです。多次元配列についてはまた後の機会に話します。
なお、これが配列変数でなければ、
SStudent students = { "赤井孝", 73, 98, 86, };
という風になります。
なお、最後の要素にもコンマがつけてありますが、これはつけていなくても構いません。あとから要素を増減する予定があれば、コンマをつけておくと便利ですね。もちろん、普通の配列変数でも同じことができます。
はい、今回はこれだけです。構造体の使い方は大体分かってきましたか?
というわけで、今回の要点です。
次回は構造体に対するポインタについて話します。では。
Last update was done on 2000.7.8
この講座の著作権はロベールが保有しています