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



別々のメモリに


アクセスしているお互いが独立した変数となっているからなのです。」



マックス「お、おれ オ~レ~オレオレオレェ~


クラスのことに夢中になりすぎて


まったく 思いもしなかった・・・


クラス型のオブジェクトをつかった


値渡し


だけじゃなく


クラス型のオブジェクトのアドレスを使った


参照渡し


もあるんだな。」








  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る