クラス型の配列宣言を実行した場合に生成されるオブジェクトのメンバ関数をクラスアスタリスク型のポインタ変数をつかって実行してみましょう 

ソーラー「そのいい方法とは・・・


とりあえず


オブジェクト

cube[0]

のメンバ関数


cube[0].display()


オブジェクト

cube[1]

のメンバ関数


cube[1].display()


オブジェクト

cube[2]

のメンバ関数


cube[2].display()

に相当するものを実行するためには



ptaのクラスCube*(アスタリスク)型のポインタ変数宣言


Cube* pta;


ptbのクラスCube*(アスタリスク)型のポインタ変数宣言


Cube* ptb;


ptcのクラスCube*(アスタリスク)型のポインタ変数宣言


Cube* ptc;


を行い


クラスCube型の配列宣言


Cube cube[3];


によって作製された


オブジェクト

cube[0]

cube[1]

cube[2]

のアドレス


&cube[0]

&cube[1]

&cube[2]

それぞれ


クラスCube*(アスタリスク)型のポインタ変数

pta

ptb

ptc

に代入します


そうすると


クラスCube*(アスタリスク)型のポインタ変数

pta

ptb

ptc

にアロー演算子を用いた


pta->display();

ptb->display();

ptc->display();

cube[0].display()

cube[1].display()

cube[2].display()


を表すことになります

☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆


Cube型のオブジェクト

cube[0]

のアドレス&cube[0]を格納するために


Cube*型のポインタ変数

pta

を作製しています。


先のエピソードでも学んだように


ptaにはオブジェクトcube[0]のアドレス


&cube[0]が代入されているので


pta->display()

cube[0].display()

をあらわすことになり


pta->display();


を実行するということは


オブジェクトcube[0]のメンバ関数display()に相当するものが実行されるというわけです。


実際に


そのことを示すプログラムはこちらになります😊」

👇


#include <iostream>


using namespace std;


class Cube{


public:

int no;

public:

float tate;

public:

float yoko;

public:

float takasa;



public:

Cube();

//🌞🌞🌞コンストラクタCube()のメンバ関数宣言を行っています🌞🌞🌞


public:

Cube(int a, float b, float c, float d);

/*🌞🌞🌞コンストラクタCube(int a,float b,float c,float d)のメンバ関数宣言を行っています🌞🌞🌞*/



public:

void display(); //自作関数display()はクラスCubeのメンバ関数とよばれます


};


Cube::Cube() {


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";

}

//👆🌞🌞🌞コンストラクタCube()の定義を行っています🌞🌞🌞



Cube::Cube(int a, float b, float c, float d) {


no = a;

tate = b;

yoko = c;

takasa = d;


cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";


}

/*👆🌞🌞🌞コンストラクタCube(int a,float b,float c,float d)の定義を行っています🌞🌞🌞*/



void Cube::display() {


cout << "立方体につけられたナンバーは" << no << "です" << "\n";

cout << "立方体の縦の長さは" << tate << "です" << "\n";

cout << "立方体の横の長さは" << yoko << "です" << "\n";

cout << "立方体の高さの長さは" << takasa << "です" << "\n";


}


//👆クラスCubeのメンバ関数となっている自作関数display()の定義をおこなっています



int main() {


Cube cube[3];

/*🌞🌞🌞配列をつかってクラスCube型のオブジェクト

cube[0]

cube[1]

cube[2]

を作製しています🌞🌞🌞*/

Cube* pta;

Cube* ptb;

Cube* ptc;


/*🌞🌞🌞Cube型のオブジェクト

cube[0]

cube[1]

cube[2]

のアドレスを格納するために

pta

ptb

ptc

Cube*型のポインタ変数宣言を実行しています。

🌞🌞🌞*/


pta = &cube[0];

ptb = &cube[1];

ptc = &cube[2];


pta->display();

ptb->display();

ptc->display();

/*👆💖💖💖💖💖💖💖💖💖ここに追加しました💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖*/


cout << "立方体につけられたナンバーは" << cube[0].no << "です" << "\n";

cout << "立方体の縦の長さは" << cube[0].tate << "です" << "\n";

cout << "立方体の横の長さは" << cube[0].yoko << "です" << "\n";

cout << "立方体の高さの長さは" << cube[0].takasa<< "です" << "\n";

cout << "立方体につけられたナンバーは" << cube[1].no << "です" << "\n";

cout << "立方体の縦の長さは" << cube[1].tate << "です" << "\n";

cout << "立方体の横の長さは" << cube[1].yoko<< "です" << "\n";

cout << "立方体の高さの長さは" << cube[1].takasa<< "です" << "\n";

cout << "立方体につけられたナンバーは" << cube[2].no << "です" << "\n";

cout << "立方体の縦の長さは" << cube[2].tate << "です" << "\n";

cout << "立方体の横の長さは" << cube[2].yoko << "です" << "\n";

cout << "立方体の高さの長さは" << cube[2].takasa << "です" << "\n";



return 0;

}



ビルド実行結果


生成されたオブジェクトのメンバ変数を初期化しました

生成されたオブジェクトのメンバ変数を初期化しました

生成されたオブジェクトのメンバ変数を初期化しました

立方体につけられたナンバーは0です

立方体の縦の長さは0です

立方体の横の長さは0です

立方体の高さの長さは0です

立方体につけられたナンバーは0です

立方体の縦の長さは0です

立方体の横の長さは0です

立方体の高さの長さは0です

立方体につけられたナンバーは0です

立方体の縦の長さは0です

立方体の横の長さは0です

立方体の高さの長さは0です

立方体につけられたナンバーは0です

立方体の縦の長さは0です

立方体の横の長さは0です

立方体の高さの長さは0です

立方体につけられたナンバーは0です

立方体の縦の長さは0です

立方体の横の長さは0です

立方体の高さの長さは0です

立方体につけられたナンバーは0です

立方体の縦の長さは0です

立方体の横の長さは0です

立方体の高さの長さは0です




ソーラー「やったね(^_-)-☆ビルド実行成功!」



マックス「オブジェクトcube[0]のメンバ関数


cube[0].display();


に相当するものを実行するために


クラスCube*型のポインタ変数ptaに


pta = &cube[0];



オブジェクトcube[0]のアドレスを代入するのか・・・・・


おれは


それ以外にいい方法を


おもいついたぞ


ソーラーよ。」


ソーラー「??クラスCube*型のポインタ変数ptaに


pta = &cube[0];



オブジェクトcube[0]のアドレス&cube[0]を代入する


以外の方法ですか??」



マックス「それはなあ


int型の配列宣言


int hairetu[3];


を行った場合


生成される


配列変数

hairetu[0]

hairetu[1]

hairetu[2]


のアドレスは


&hairetu[0]

&hairetu[1]

&hairetu[2]


とあらわすこともできるが


配列変数

hairetu[0]

hairetu[1]

hairetu[2]


のアドレスを格納したポインタ変数は


hairetu

hairetu+1

hairetu+2


とあらわされるだろう。


同様に


クラスCubeの配列宣言


Cube cube[3];


を実行した場合


生成されるオブジェクト


cube[0]

cube[1]

cube[2]


のアドレスは


&cube[0]

&cube[1]

&cube[2]


とあらわされるが


オブジェクト


cube[0]

cube[1]

cube[2]


のアドレスを格納したポインタ変数は


cube

cube+1

cube+2


とあらわされるんじゃないか?


となると


クラスCube*型のポインタ変数

pta

ptb

ptc


pta = &cube[0];

ptb = &cube[0];

ptc = &cube[0];



オブジェクトcube[0]のアドレス

オブジェクトcube[1]のアドレス

オブジェクトcube[2]のアドレス

を代入しなくても


クラスCube*型のポインタ変数ptaに


pta =cube;

pta =(cube+1);

pta =(cube+2);



オブジェクトcube[0]のアドレスを格納したポインタ変数cube

オブジェクトcube[1]のアドレスを格納したポインタ変数cube+1

オブジェクトcube[2]のアドレスを格納したポインタ変数cube+2


代入することにより


オブジェクトcube[0]のアドレス

オブジェクトcube[1]のアドレス

オブジェクトcube[2]のアドレス



Cube*(アスタリスク)型のポインタ変数pta

Cube*(アスタリスク)型のポインタ変数ptb

Cube*(アスタリスク)型のポインタ変数ptc


に代入することができるんじゃないか?」


ソーラー「そうですね。


先ほどのプログラムの


pta = &cube[0];

ptb = &cube[0];

ptc = &cube[0];

pta =cube;

pta =(cube+1);

pta =(cube+2);


に変更して


実行してみましょう。」


マックス「ははは これでいけるか 楽しみじゃないか」


ソーラー「それでは


pta = &cube[0];

ptb = &cube[0];

ptc = &cube[0];

pta =cube;

pta =(cube+1);

pta =(cube+2);


に変更したプログラムをっ


ビルドっ」


#include <iostream>


using namespace std;


class Cube{


public:

int no;

public:

float tate;

public:

float yoko;

public:

float takasa;



public:

Cube();

//🌞🌞🌞コンストラクタCube()のメンバ関数宣言を行っています🌞🌞🌞


public:

Cube(int a, float b, float c, float d);

/*🌞🌞🌞コンストラクタCube(int a,float b,float c,float d)のメンバ関数宣言を行っています🌞🌞🌞*/



public:

void display(); //自作関数display()はクラスCubeのメンバ関数とよばれます


};


Cube::Cube() {


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";

}

//👆🌞🌞🌞コンストラクタCube()の定義を行っています🌞🌞🌞



Cube::Cube(int a, float b, float c, float d) {


no = a;

tate = b;

yoko = c;

takasa = d;


cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";


}

/*👆🌞🌞🌞コンストラクタCube(int a,float b,float c,float d)の定義を行っています🌞🌞🌞*/



void Cube::display() {


cout << "立方体につけられたナンバーは" << no << "です" << "\n";

cout << "立方体の縦の長さは" << tate << "です" << "\n";

cout << "立方体の横の長さは" << yoko << "です" << "\n";

cout << "立方体の高さの長さは" << takasa << "です" << "\n";


}


//👆クラスCubeのメンバ関数となっている自作関数display()の定義をおこなっています



int main() {


Cube cube[3];

/*🌞🌞🌞配列をつかってクラスCube型のオブジェクト

cube[0]

cube[1]

cube[2]

を作製しています🌞🌞🌞*/


Cube* pta;

Cube* ptb;

Cube* ptc;


/*🌞🌞🌞Cube型のオブジェクト

cube[0]

cube[1]

cube[2]

のアドレスを格納するために

pta

ptb

ptc

Cube*型のポインタ変数宣言を実行しています。

🌞🌞🌞*/


pta = cube;

ptb = (cube+1);

ptc = (cube+2);



pta->display();

ptb->display();

ptc->display();

/*👆💖💖💖💖💖💖💖💖💖ここに追加しました💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖*/


cout << "立方体につけられたナンバーは" << cube[0].no << "です" << "\n";

cout << "立方体の縦の長さは" << cube[0].tate << "です" << "\n";

cout << "立方体の横の長さは" << cube[0].yoko << "です" << "\n";

cout << "立方体の高さの長さは" << cube[0].takasa << "です" << "\n";

cout << "立方体につけられたナンバーは" << cube[1].no << "です" << "\n";

cout << "立方体の縦の長さは" << cube[1].tate << "です" << "\n";

cout << "立方体の横の長さは" << cube[1].yoko << "です" << "\n";

cout << "立方体の高さの長さは" << cube[1].takasa << "です" << "\n";

cout << "立方体につけられたナンバーは" << cube[2].no << "です" << "\n";

cout << "立方体の縦の長さは" << cube[2].tate << "です" << "\n";

cout << "立方体の横の長さは" << cube[2].yoko << "です" << "\n";

cout << "立方体の高さの長さは" << cube[2].takasa << "です" << "\n";



return 0;

}



ビルド実行結果



生成されたオブジェクトのメンバ変数を初期化しました

生成されたオブジェクトのメンバ変数を初期化しました

生成されたオブジェクトのメンバ変数を初期化しました

立方体につけられたナンバーは0です

立方体の縦の長さは0です

立方体の横の長さは0です

立方体の高さの長さは0です

立方体につけられたナンバーは0です

立方体の縦の長さは0です

立方体の横の長さは0です

立方体の高さの長さは0です

立方体につけられたナンバーは0です

立方体の縦の長さは0です

立方体の横の長さは0です

立方体の高さの長さは0です

立方体につけられたナンバーは0です

立方体の縦の長さは0です

立方体の横の長さは0です

立方体の高さの長さは0です

立方体につけられたナンバーは0です

立方体の縦の長さは0です

立方体の横の長さは0です

立方体の高さの長さは0です

立方体につけられたナンバーは0です

立方体の縦の長さは0です

立方体の横の長さは0です

立方体の高さの長さは0です


マックス「にゃはは やはり


成功か!


cube

cube+1

cube+2

cube[0]

cube[1]

cube[2]

のアドレス

&cube[0]

&cube[1]

&cube[2]

格納するポインタ変数になるというわけだ!


ふっ


決まったな」









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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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