🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
自作関数の引数に構造体変数を用いることができます そしてmain関数内で定義された構造体変数を代入することもできます(この場合 値渡しとなります)
自作関数の引数に構造体変数を用いることができます そしてmain関数内で定義された構造体変数を代入することもできます(この場合 値渡しとなります)
てんC「自作関数をもういちど復習してみますか。
ソーラー「自作関数とは次のプログラム?
こんなのだったかな?」
#include <iostream>
using namespace std;
void watchCubedata(int x){
cout<<x<<"\n";
}
int main()
{
int a=5;
watchCubedata(a);
/*変数aに格納された数値データ5を変数xに値渡ししています*/
return 0;
}
ビルド実行結果
5
ソーラー 「このプログラムではwatchCubedataという自作関数をつくっているね。
自作関数の内容は変数xにあたえられた数値を表示する
cout<<x<<"\n";だね。
てんC「ソーラーさん、もう少し詳しく見ていきます。
#include <iostream>
using namespace std;
void watchCubedata(int x){
cout<<x<<"\n";
}
/*自作関数watchCubedataを定義しました。
int xでxの変数宣言を行いながら、かつ
変数xを自作関数watchCubedataの仮引数に指定しています*/
int main()
{
int a=5;
/*aを変数宣言し、変数aに数値データ5を格納しました。*/
watchCubedata(a);
/*自作関数の仮引数である変数xに
main関数内で定義された実引数aを代入しました。
これにより
watchCubedataの仮引数に5があたえられます。
*/
return 0;
}
ビルド実行結果
5
てんC「自作関数内で定義された変数xは仮引数
main関数内で定義された変数aは実引数というのでした。
仮引数と実引数の違いについてもう1ど確認されますか?」
ソーラー「仮引数と実引数・・・おねがい」
てんC「それでは仮引数と実引数の違いを
次のプログラムで示してみたいと思います。
新たに自作関数
void watchCubedata(int x){
x=x+5;
cout<<x<<"\n";
}
を作成しプログラムを組むと
#include <iostream>
using namespace std;
void watchCubedata(int x){
x=x+5;
cout<<x<<"\n";
}
/*自作関数watchCubedataを定義しました。
int xでxの変数宣言を行いながら、かつ
自作関数watchCubedataの仮引数に変数xを指定しています*/
int main()
{
int a=1;
/*aを変数宣言し、変数aに数値1を格納しました。*/
watchCubedata(a);
/*自作関数の仮引数である変数xに
main関数内で定義された実引数aを代入しました。
これにより
watchCubedataの仮引数に数値データ1があたえられます。
*/
cout<<a<<"\n";
return 0;
}
ビルド実行結果
6
1
となります
このプログラムのように
🍋自作関数内で定義された仮引数である変数xに🍋
🍋main関数内で定義された実引数aを代入した場合🍋
🍋変数aに格納されている数値データ1だけが仮引数である変数xに渡されます🍋
このように
🍋実引数である変数aから仮引数である変数xへデータを渡す方法を🍋
🍋値渡し🍋
といいます
よって
main関数内で定義された変数aは
自作関数の操作をうけることがなく
変数aに格納されている値は
int a=1;で初期化されたa=1のままとなり
cout<<a<<"\n";
によって示されるaの値は1となります
watchCubedata(a);の操作により
変数aに格納されている値は6になることはありません
つまり
実引数aに格納されている数値1を仮引数xに代入しているだけなので
仮引数xに格納された数値データ1にいくら操作をくわえても
実引数aに格納されている数値データの値は
a=1のまま
全然まった~く変化しないのでした。
仮引数と実引数の関係に関しては
この説明でよいでしょうか。」
ソーラー「そう、そう 度忘れしてた
くわしくは
値渡し 参照渡しのエピソードをみてちょうだい、だね。
ところで
自作関数の引数に構造体変数をもちいるってどういうことかな」
てんC「実際に
自作関数の引数に構造体変数をもちいたプログラムをみてみませんか。」
ソーラー
「そうだね。そうしてみたらわかりやすいかも。」
てんC「こちらが そのプログラムとなります。
#include <iostream>
using namespace std;
typedef struct Cube{
int no;
float tate;
float yoko;
float takasa;
}Cube;
/*struct Cubeの構造体宣言を行いながら
構造体名を struct Cube からCubeに変更しました*/
void watchCubedata(Cube a){
a.no=2*a.no;
a.tate=2*a.tate;
a.yoko=2*a.yoko;
a.takasa=2*a.takasa;
cout<<a.no<<"\n";
cout<<a.tate<<"\n";
cout<<a.yoko<<"\n";
cout<<a.takasa<<"\n";
}
/*新たに自作関数watchCubedataを定義しました。
立方体につけられている
ナンバー
縦
横
高さ
のデータ情報を2倍にして
cout出力表示することができる自作関数です
ここでは
Cube aでaの構造体変数宣言を行いながら
自作関数watchCubedataの仮引数として
構造体Cube型の構造体変数 aを指定しています。
この構造体変数aに
main関数内で定義された同じ構造体Cube型の構造体変数cube1を代入して構造体変数cube1が格納している数値を構造体変数aにわたしていこうというわけですね。
Cube*型のポインタ変数を自作関数の引数につかって構造体変数cube1のアドレスを渡さないので 値渡しとなります。
そして ここではaの 構造体変数宣言をしただけですので
構造体変数aにはまだ構造体変数cube1は代入されていません。*/
int main()
{
Cube cube1={1,7.0,7.0,7.0};
/*cube1を 構造体変数宣言し、数値を格納して初期化しました。*/
watchCubedata(cube1);
/*自作関数watchCubedataの仮引数である構造体Cube型の構造体変数 aに
同じ構造体Cube型の構造体変数cube1を代入しました。*/
cout<<cube1.no<<"\n";
cout<<cube1.tate<<"\n";
cout<<cube1.yoko<<"\n";
cout<<cube1.takasa<<"\n";
return 0;
}
ビルド実行結果
2
14
14
14
1
7
7
7
ソーラー「さっきのプログラムでは
自作関数の仮引数である整数の型intの変数xに
main関数内でつくられた実引数である変数a
を代入していたのが
今度のプログラムでは
自作関数の仮引数である
構造体 Cube 型の構造体変数aに
main関数内で定義された実引数である
同じ構造体 Cube 型の構造体変数cube1を
代入したというわけなんだね。
というか そういうこともできるんだね。」
てんC「そうなんです。
そして その自作関数の引数である構造体変数aに構造体変数cube1を
代入することにより
構造体変数aのメンバ変数
a.no
a.tate
a.yoko
a.takasa
に
格納された数値データ
1
7.0
7.0
7.0
が
自作関数の定義
a.no=2*a.no;
a.tate=2*a.tate;
a.yoko=2*a.yoko;
a.takasa=2*a.takasa;
により
2倍され
cout<<a.no<<"\n";
cout<<a.tate<<"\n";
cout<<a.yoko<<"\n";
cout<<a.takasa<<"\n";
↑
この自作関数の4つの命令文により
コマンドプロンプト画面に
cout出力表示されているわけです。」
ソーラー「このように構造体変数aを自作関数の引数につかうと
構造体変数aに構造体変数cube1を代入することにより
1度に
構造体変数cube1の4つのメンバ変数に格納されていた4つの数値データを
自作関数にかけることができるね。
いい仕組みだね。😊」
🐦 🐦 🐦 🐦 🐦
このとき
構造体変数cube1から構造体変数aへ
値渡しがおこなわれています
自作関数の引数にポインタ変数はもちいられていませんね。
ですから構造体変数cube1のアドレスが渡されることもありません。
参照渡しではありません。
ですので
cube1の構造体変数宣言、初期化
Cube cube1={1,7.0,7.0,7.0};
により
構造体変数cube1のメンバ変数に
cube1.no=1
cube1.tate=7.0
cube1.yoko=7.0
cube1.takasa=7.0
と数値データが格納されている状態は
構造体変数cube1が
自作関数であるwatchCubedataの引数に代入された
watchCubedata(cube1);
が実行されても
構造体変数cube1のメンバ変数に格納されている数値データが
構造体変数 aに値渡しされただけで
構造体変数cube1は自作関数watchCubedataの操作を
うけることはありません
よって
構造体変数cube1に格納されている数値データは
自作関数の操作をうけることはありません。
ですので
cout << cube1.no << "\n";
cout << cube1.tate << "\n";
cout << cube1.yoko << "\n";
cout << cube1.takasa << "\n";
のコンパイル結果は
1
7
7
7
となります。
構造体変数cube1のメンバ変数に格納されている数値データは
cube1.no=1
cube1.tate=7.0
cube1.yoko=7.0
cube1.takasa=7.0
のまま2倍とはなりません。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます