🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
main関数内で定義されたオブジェクトのメンバ変数に格納された数値データをクラスアスタリスク型のポインタ変数を引数にもつ自作関数を実行して変更してみます 自作関数の引数に参照渡しを行います
main関数内で定義されたオブジェクトのメンバ変数に格納された数値データをクラスアスタリスク型のポインタ変数を引数にもつ自作関数を実行して変更してみます 自作関数の引数に参照渡しを行います
てんC「では 再び 次のプログラムをご覧ください。
#include <iostream>
using namespace std;
class Cube {
public:
int no;
public:
float tate;
public:
float yoko;
public:
float takasa;
public:
void display();
};
void Cube::display() {
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
}
//👆クラスCubeのメンバ関数となっている自作関数display()の定義をおこなっています
void Cubedata2baihyouji(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";
return;
}
/*👆クラスCubeのメンバ関数でない
普通の自作関数Cubedata2baihyoujiの定義をおこなっています
引数に
aのクラスCube*(アスタリスク) 型のポインタ変数宣言
Cube* a
を用いることにより
main関数内でクラスCube型のオブジェクト宣言により
作製されたオブジェクトcube1のアドレスを
Cube*(アスタリスク) 型のポインタ変数aに代入することができます
*/
int main() {
Cube cube1;
//👆cube1のクラスCube型のオブジェクト宣言をおこなっています
cube1.no = 1;
cube1.tate = 2.0;
cube1.yoko = 3.0;
cube1.takasa = 4.0;
cube1.display();
Cubedata2baihyouji(&cube1);
cout << "立方体につけられたナンバーは" << cube1.no << "です" << "\n";
cout << "立方体の縦の長さは" << cube1.tate << "です" << "\n";
cout << "立方体の横の長さは" << cube1.yoko << "です" << "\n";
cout << "立方体の高さの長さは" << cube1.takasa << "です" << "\n";
return 0;
}
ビルド実行結果
立方体につけられたナンバーは1です
立方体の縦の長さは2です
立方体の横の長さは3です
立方体の高さの長さは4です
立方体につけられたナンバーは2です
立方体の縦の長さは4です
立方体の横の長さは6です
立方体の高さの長さは8です
立方体につけられたナンバーは2です
立方体の縦の長さは4です
立方体の横の長さは6です
立方体の高さの長さは8です
てんC「このプログラムでは
まず
main関数内で
cube1.no = 1;
cube1.tate = 2.0;
cube1.yoko = 3.0;
cube1.takasa = 4.0;
cube1.display();
が実行されています。
オブジェクト変数cube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に数値データ
1
2.0
3.0
4.0
が代入されているので
cube1.display();
の実行結果は
立方体につけられたナンバーは1です
立方体の縦の長さは2です
立方体の横の長さは3です
立方体の高さの長さは4です
となっています。
次に
クラスのメンバ関数でない自作関数
Cubedata2baihyouji(&cube1);
が実行されていますね。
自作関数Cubedata2baihyoujiの定義は
👇
void Cubedata2baihyouji(Cubedatadisplay* 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";
return;
}
👆
となっていて
自作関数Cubedata2baihyoujiの引数部分の()内に
aのCube*型のポインタ変数宣言
Cube* a
が記述されていますね。
つまり
自作関数
Cubedata2baihyouji(&cube1);
の&cube1は
aのCube*型のポインタ変数宣言
Cube* a
によって作成される
ポインタ変数aに
a=&cube1;
と代入されているわけです。
このとき
ポインタ変数aに
アロー演算子
->
を用いた
a->no
a->tate
a->yoko
a->takasa
は
アドレス
&cube1.no
&cube1.tate
&cube1.yoko
&cube1.takasa
のメモリに
アクセスすることができるようになります。
つまり
アドレス
&cube1.no
&cube1.tate
&cube1.yoko
&cube1.takasa
のメモリに
格納されている数値データ
1
2.0
3.0
4.0
を表すことになります。
また
ポインタ変数aに
アロー演算子->
を用いた
a->no
a->tate
a->yoko
a->takasa
を使って
アドレス
&cube1.no
&cube1.tate
&cube1.yoko
&cube1.takasa
のメモリに
格納されている数値データを変更することもできます。
つまり
ポインタ変数aに
アロー演算子->
を用いた
a->no
a->tate
a->yoko
a->takasa
は
オブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
そのものをあらわすことに等しくなりますので
自作関数
Cubedata2baihyouji(&cube1);
を実行するということは
自作関数の定義内の
👇
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";
👆
が実行されるということですが
この場合
a->no
a->tate
a->yoko
a->takasa
は
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に等しくなっているので
cube1.no = 2 *cube1.no;
cube1.tate = 2 *cube1.tate;
cube1.yoko = 2 *cube1.yoko;
cube1.takasa = 2 *cube1.takasa;
cout << "立方体につけられたナンバーは" << cube1.no << "です" << "\n";
cout << "立方体の縦の長さは" << cube1.tate << "です" << "\n";
cout << "立方体の横の長さは" << cube1.yoko << "です" << "\n";
cout << "立方体の高さの長さは" << cube1.takasa << "です" << "\n";
が実行されることに等しくなります。
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に数値データ
1
2.0
3.0
4.0
が代入されているので
Cubedata2baihyouji(&cube1);
の
プログラムの実行結果は
立方体につけられたナンバーは2です
立方体の縦の長さは4です
立方体の横の長さは6です
立方体の高さの長さは8です
となります。
マックス「なるほどほど
そんな仕組みになっていたのか」
ソーラー「ところで
自作関数Cubedata2baihyoujiの引数()内の
aのCube*型のポインタ変数宣言
Cube* a
に
よって作製された
🍓ポインタ変数a🍓
に
main関数内で
オブジェクト宣言
Cube cube1;
によって作製された
オブジェクトcube1の🍅アドレス&cube1🍅を代入しているけど
これって
🍋参照渡し(ポインタ渡し)🍋
そのもの何じゃなんじゃないかな。」
てんC「はい このプログラムでは
オブジェクトcube1の🍅アドレス&cube1🍅を
Cube* aによって作成されるポインタ変数aに
代入するという
🍋参照渡し(ポインタ渡し)🍋
が行われています。
🍋参照渡し(ポインタ渡し)🍋とは
ポインタ変数に
ある変数のアドレスを代入することでした。
ポインタ変数に
ある変数のアドレスを代入すると
ポインタ変数をもちいて
ある変数のアドレスのメモリに
直接
アクセスして
ある変数のアドレスのメモリに格納されている数値データを
変更することができましたね。
たとえば
int* pta;とポインタ変数宣言された
ポインタ変数ptaに
int a;と変数宣言された
変数aのアドレス&aを
pta=&a;
と
代入すると
ポインタ変数ptaに*をつけた
*ptaをもちいて
直接
変数aのアドレス&aのメモリに
アクセスして
変数aのアドレス&aのメモリに格納されている数値データを
変更することができましたね。
このプログラムでは
自作関数Cubedata2baihyoujiの引数()内の
aのCube*型のポインタ変数宣言
Cube* a
に
よって作製された
🍓ポインタ変数a🍓
に
オブジェクトcube1の🍅アドレス&cube1🍅を代入する
🍋参照渡し(ポインタ渡し)🍋
を
おこなうことにより
オブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
の
アドレス
&cube1.no
&cube1.tate
&cube1.yoko
&cube1.takasa
のメモリに
ポインタ変数aに
アロー演算子->
を用いた
a->no
a->tate
a->yoko
a->takasa
をもちいて
直接
アクセスしているというわけです。
ですので
a->no
a->tate
a->yoko
a->takasa
と
オブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
は同じメモリに
アクセスしているのですね。
そのため
main関数内で
Cubedata2baihyouji(&cube1);
が実行され
a->no = 2 * a->no;
a->tate = 2 * a->tate;
a->yoko = 2 * a->yoko;
a->takasa = 2 * a->takasa;
が実行されると
cube1.no = 2 *cube1.no;
cube1.tate = 2 *cube1.tate;
cube1.yoko = 2 *cube1.yoko;
cube1.takasa = 2 *cube1.takasa;
が実行されることになり
オブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に格納されている数値データは
1
2.0
3.0
4.0
から
2
4.0
6.0
8.0
となります。
そして
Cubedata2baihyouji(&cube1);
の命令文の
次に記述されている命令文
cout << "立方体につけられたナンバーは" << cube1.no << "です" << "\n";
cout << "立方体の縦の長さは" << cube1.tate << "です" << "\n";
cout << "立方体の横の長さは" << cube1.yoko << "です" << "\n";
cout << "立方体の高さの長さは" << cube1.takasa << "です" << "\n";
が実行されたときの
ビルド実行結果が
立方体につけられたナンバーは2です
立方体の縦の長さは4です
立方体の横の長さは6です
立方体の高さの長さは8です
となっていることからも
オブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に格納されている数値データが
1
2.0
3.0
4.0
から
2
4.0
6.0
8.0
に変化しているのがわかりますね。
自作関数Cubedata2baihyoujiの引数()内の
aのCube*型のポインタ変数宣言
Cube* a
に
よって作製された
🍓ポインタ変数a🍓
に
オブジェクトcube1の🍅アドレス&cube1🍅を代入する
🍋参照渡し(ポインタ渡し)🍋
を
おこなうことにより
main関数内でオブジェクト宣言されたオブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に格納されている数値データが
自作関数Cubedata2baihyoujiの
操作を受けて
変更されました。(´▽`*)
参照渡しとは違い
自作関数Cubedata2baihyouji(Cube a)
の
aのCube型のオブジェクト宣言
Cube a
によって作製されたオブジェクトaに
main関数内でオブジェクト宣言されたオブジェクトcube1を代入する
値渡しの方法では
main関数内でオブジェクト宣言されたオブジェクトのメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に格納されている数値は
自作関数Cubedata2baihyoujiの
操作を受けず
変更されませんでしたね(´▽`*)
その
値渡しが行われている様子をあらわす
次のプログラムをご覧ください。
👇
#include <iostream>
using namespace std;
class Cube{
public:
int no;
public:
float tate;
public:
float yoko;
public:
float takasa;
public:
void display();
};
void Cube::display() {
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
}
//👆クラスCubeのメンバ関数となっている自作関数 display()の定義をおこなっています
void Cubedata2baihyouji(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";
return;
}
/*👆クラス内のメンバ関数でない
普通の自作関数Cubedata2baihyoujiの定義をおこなっています*/
int main() {
Cube cube1;
//👆cube1のクラスCube型のオブジェクト宣言をおこなっています
cube1.no = 1;
cube1.tate = 2.0;
cube1.yoko = 3.0;
cube1.takasa = 4.0;
cube1.display();
Cubedata2baihyouji(cube1);
cout << "立方体につけられたナンバーは" << cube1.no << "です" << "\n";
cout << "立方体の縦の長さは" << cube1.tate << "です" << "\n";
cout << "立方体の横の長さは" << cube1.yoko << "です" << "\n";
cout << "立方体の高さの長さは" << cube1.takasa << "です" << "\n";
/*🌞👆オブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に最終的に
格納されている数値を確かめるため
これらの命令文を加えました。*/
return 0;
}
プログラムの実行結果
立方体につけられたナンバーは1です
立方体の縦の長さは2です
立方体の横の長さは3です
立方体の高さの長さは4です
立方体につけられたナンバーは2です
立方体の縦の長さは4です
立方体の横の長さは6です
立方体の高さの長さは8です
立方体につけられたナンバーは1です
立方体の縦の長さは2です
立方体の横の長さは3です
立方体の高さの長さは4です
てんC「値渡しが行われている
このプログラムでは
自作関数Cubedata2baihyoujiの引数()内に
cube1のCube型のオブジェクト宣言
Cube a
が記述されています。
自作関数
Cubedata2baihyouji(cube1);
が実行されるとき
🍓このCube型のオブジェクトa🍓
に
main関数内で
オブジェクト宣言された
🍊オブジェクトcube1🍊
が代入されます
すると
オブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に格納された数値データだけが
オブジェクトaのメンバ変数
a.no
a.tate
a.yoko
a.takasa
に
わたされるのでしたね。
ですから
自作関数
Cubedata2baihyouji(cube1);
が実行されて
つまり
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";
が実行されて
プログラムの実行結果が
立方体につけられたナンバーは2です
立方体の縦の長さは4です
立方体の横の長さは6です
立方体の高さの長さは8です
になったとしても
a.no
a.tate
a.yoko
a.takasa
に格納されている数値データが
2
4.0
6.0
8.0
となっただけで
オブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に格納された数値データは
1
2.0
3.0
4.0
のまま変化しないのでしたね。
なぜなら
このプログラムの
自作関数の引数として設定されているCube aにより生成される
オブジェクトaのメンバ変数
a.no
a.tate
a.yoko
a.takasa
と
main関数内でオブジェクト宣言されたオブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
は
別々のメモリに
アクセスしているお互いが独立した変数となっているからなのです。」
マックス「お、おれ オ~レ~オレオレオレェ~
クラスのことに夢中になりすぎて
まったく 思いもしなかった・・・
クラス型のオブジェクトをつかった
値渡し
だけじゃなく
クラス型のオブジェクトのアドレスを使った
参照渡し
もあるんだな。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます