引数をもつクラスのコンストラクタを定義してみよう その2

ソーラー「そこで😊👍


引数をもつコンストラクタを作製してみます。


引数を持たないコンストラクタは



Cube::Cube() {


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


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

}

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



のように定義されていました。



Cube::Cube() の()内の部分に


引数をうけとる変数宣言は記述されていませんね。



この


コンストラクタが用いられたプログラムは次のようになっていました。


#include <iostream>


using namespace std;


class Cube {


public:

int no;

public:

float tate;

public:

float yoko;

public:

float takasa;



public:

Cube();

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


public:

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



};



Cube::Cube() {


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


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

}

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


void Cube::display() {


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

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

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

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


}


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




int main() {


Cube cube1;


//👆cube1のクラスCube型のオブジェクト宣言をおこなっています

/*🌞このとき オブジェクトcube1のコンストラクタが自動的に実行されます


オブジェクトcube1のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

0

0.0

0.0

0.0

に初期化されます。

そして

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

が実行されます

🌞*/


cube1.display();


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

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

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

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


return 0;

}


ビルド実行結果

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

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

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

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

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

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

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

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

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


ソーラー「で、


今度は引数をもつコンストラクタを作製してみようというわけです」



マックス「


Cube::Cube() {


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


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

}


と定義されたコンストラクタを


引数をもつコンストラクタに変更するのか?


微妙だな


どう書き換えるのか」


ソーラー「そう


たとえば


こんなコンストラクタの定義はどうかな?

👇

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


no = a;

tate =b;

yoko =c;

takasa =d;


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


}

👆


このコンストラクタの定義を組み込んだプログラムを実行してみると


以下のようになります。」



#include <iostream>


using namespace std;


class Cube{


public:

int no;

public:

float tate;

public:

float yoko;

public:

float takasa;



public:

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

//🌞🌞🌞引数を持つコンストラクタのメンバ関数宣言を行っています🌞🌞🌞


public:

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



};



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


no = a;

tate = b;

yoko = c;

takasa = d;


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


}

//👆🌞🌞🌞引数を持つコンストラクタの定義を行っています🌞🌞🌞


void Cube::display() {


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

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

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

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


}


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




int main() {


Cube cube1(1, 1.0, 1.0, 1.0);


//👆cube1のクラスCube型のオブジェクト宣言をおこなっています

/*このとき(1, 1.0, 1.0, 1.0)がオブジェクトcube1にくっついていることに御注目ください*/

/*🌞このとき オブジェクトcube1のコンストラクタが自動的に実行されています


すると

引数を持つコンストラクタの定義内の


no = a;

tate = b;

yoko = c;

takasa = d;


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

が実行されることになります


Cube cube1(1, 1.0, 1.0, 1.0);


により


int a

float b

float c

float d

1

1.0

1.0

1.0

が代入されます

no

tate

yoko

takasa

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

をあらわすことになるので


cube1.no=1;

cube1.tate=1.0;

cube1.yoko=1.0;

cube1.takasa=1.0;


が実行されて


オブジェクトcube1のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

1

1.0

1.0

1.0

に初期化されます。

そして

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

が実行されます

🌞*/


cube1.display();


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

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

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

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


return 0;

}


ビルド実行結果

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

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

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

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

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

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

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

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

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




マックス「なっなんだ~ このコンストラクタの定義は???


何をしているのか全然分からないじゃないか?」


ソーラー「コンストラクタの定義が


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


no = a;

tate =b;

yoko =c;

takasa =d;


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


}


の場合は


Cubeのクラス宣言内において


クラスCubeのメンバ関数である


クラスCubeのコンストラクタのメンバ関数宣言は


      

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



となります。



先ほどのプログラムのように


クラスCubeのメンバ関数である


クラスCubeのコンストラクタのメンバ関数宣言が



           🌞Cube();🌞


となっていて


コンストラクタの定義が


Cube::Cube() {


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


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

}


となっていたとします


cube1のクラスCube型のオブジェクト宣言


Cube cube1;


が行われた場合


同時に自動的に


オブジェクトcube1のコンストラクタが実行されます


このとき


コンストラクタの定義のブロック {}内の

👇

Cube::Cube() {


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


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

}

👆


no

tate

yoko

takasa


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


が代入された


cube1.no = 0;

cube1.tate = 0.0;

cube1.yoko = 0.0;

cube1.takasa = 0.0;


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

}


が実行されることになります



オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa



cube1.no=0;

cube1.tate=0.0;

cube1.yoko=0.0;

cube1.takasa=0.0;


と初期化されました。


ところが


クラスCubeのコンストラクタのメンバ関数宣言が


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


となっていて


コンストラクタの定義が


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


no = a;

tate =b;

yoko =c;

takasa =d;


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

}


となっている場合は


main関数内で


オブジェクトcube1を生成するとき


cube1のクラスCube型のオブジェクト宣言は


           🌞Cube cube1;🌞


でなく


        🌞Cube cube1(1,1.0,1.0,1.0);🌞


となるんです。」


マックス「おお なんかオブジェクト宣言の仕方が変わった?」


ソーラー「


cube1に引数部分(1,1.0,1.0,1.0)が追加されているね。(*´▽`*)」


マックス「


cube1のクラスCube型のオブジェクト宣言は


           🌞Cube cube1;🌞


でなく


        🌞Cube cube1(1,1.0,1.0,1.0);🌞


となるんかい(*^。^*)」


ソーラー「そうなんです!


このように


クラスCubeのコンストラクタのメンバ関数宣言が


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


となっていて


コンストラクタの定義が


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


no = a;

tate =b;

yoko =c;

takasa =d;


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

}


となっている場合に


main関数内で


オブジェクトcube1を作成するには



            オブジェクト宣言


         Cube cube1(1,1.0,1.0,1.0);



        👆この命令文を実行するしか方法がないのです。


       

          Cube cube1; 


を実行して 


オブジェクトcube1を作製することはできません。


         Cube cube1; 


を実行しても


ビルドエラーが表示されます。  」             」



マックス「ということは


クラスCubeのメンバ関数である


クラスCubeのコンストラクタのメンバ関数宣言が


Cube();


のように引数を持たない場合は


クラスCube型のcube1のオブジェクト宣言は


Cube cube1;


のように


cube1は引数をもたず


クラスCubeのメンバ関数である


クラスCubeのコンストラクタのメンバ関数宣言が


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


のように引数を持つ場合は


クラスCube型のcube1のオブジェクト宣言は


Cube cube1(1,1.0,1.0,1.0);


のように


cube1は引数部分(1,1.0,1.0,1.0)をもつということになるな・・


となると


        🌞cube1のオブジェクト宣言の形は🌞



    🌞クラスCubeのメンバ関数である🌞


    🌞クラスCubeのコンストラクタが🌞


       🌞引数をもつかもたないかによって🌞


       🌞cube1が引数をもつかもたないかが決まる🌞



というわけか


コンストラクタの定義は


オブジェクト宣言の形にまで影響をあたえるのか\(^o^)/


これは意外な発見だな。


やるじゃないか(*^。^*)」



ソーラー「そうなんです。


クラスのメンバ関数にクラスのコンストラクタを加える場合は


オブジェクト宣言の形は


クラスのコンストラクタの形に


よって決定されることに注意かな😊


そして


cube1のクラスCube型のオブジェクト宣言



        🌞Cube cube1(1,1.0,1.0,1.0);🌞



が実行されると


オブジェクトcube1のメンバ関数である


オブジェクトcube1のコンストラクタが実行されます。


オブジェクトcube1のコンストラクタが実行されますが


コンストラクタの定義が


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


no = a;

tate =b;

yoko =c;

takasa =d;


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

}


となっているので


no

tate

yoko

takasa

の部分に


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


が代入された


cube1.no= a;

cube1.tate=b;

cube1.yoko=c;

cube1.takasa=d;


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



実行されることになります。



 🌞Cube cube1(1,1.0,1.0,1.0);🌞


の命令文をみてもわかるように


cube1の引数部分()内の


変数宣言

int a

float b

float c

float d

には

1

1.0

1.0

1.0

が代入されているので


cube1のクラスCube型のオブジェクト宣言



        🌞Cube cube1(1,1.0,1.0,1.0);🌞



が実行されると


cube1.no= a;

cube1.tate=b;

cube1.yoko=c;

cube1.takasa=d;


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


a

b

c

d


1

1.0

1.0

1.0

が代入された


cube1.no=1;

cube1.tate=1.0;

cube1.yoko=1.0;

cube1.takasa=1.0;


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



実行されることになります。


ということは


Cube cube1(1,1.0,1.0,1.0);


引数部分に代入した数値データ🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤

1

1.0

1.0

1.0



オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa



初期化されるというわけなんですね。」


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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