コンストラクタの引数にデフォルト引数をもちいてみよう。 その1


ソーラー「今度は


コンストラクタの引数をデフォルト引数に設定してみようかな。


まずは次のプログラムをご覧ください。


#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);

/*🌞🌞🌞コンストラクタ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";


}

/*👆🌞🌞🌞コンストラクタ

Cube::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 cube1(1,1.0,1.0,1.0);


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

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


コンストラクタCube(int a,float b,float c,float d)の定義内の


no = a;

tate = b;

yoko = c;

takasa = d;

no

tate

yoko

takasa



クラスCube型のオブジェクトcube1のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

が代入された

cube1.no=a;

cube1.tate=b;

cube1.yoko=c;

cube1.takasa=d;


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


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


により


aに1

bに1.0

cに1.0

dに1.0

が代入されることになるので


cube1.no=1;

cube1.tate=1.0;

cube1.yoko=1.0;

cube1.takasa=1.0;


が実行され


クラスCube型のオブジェクト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のメンバ関数として


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


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



設定されています。


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


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


が実行されると


コンストラクタCube(int a,float b,float c,float d)の定義内の


no = a;

tate = b;

yoko = c;

takasa = d;

no

tate

yoko

takasa



クラスCubek型のオブジェクトcube1のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

が代入された

cube1.no=a;

cube1.tate=b;

cube1.yoko=c;

cube1.takasa=d;


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


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


により


aに1

bに1.0

cに1.0

dに1.0

が代入されることになるので


cube1.no=1;

cube1.tate=1.0;

cube1.yoko=1.0;

cube1.takasa=1.0;


が実行され


クラスCube型のオブジェクトcube1のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

1

1.0

1.0

1.0

に初期化されます。

そして

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

が実行されます

ところで


ここで



コンストラクタ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";


}


から


       🌞デフォルト引数を用いて🌞



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


no = a;

tate = b;

yoko = c;

takasa = d;


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


}


に変更してみたいと思います。



-----------------------------------------------------------------------


自作関数には引数が存在するものがあります 


        デフォルト引数とは


   既にデータが代入されている引数のことなんです


既にデータが代入されていますが


自作関数の実行時に新たにデータを代入することもできる引数なのです

-----------------------------------------------------------------------


マックス「これだと


なんかおかしいことにならないか?


コンストラクタCube(int a,float b,float c,float d)の定義を


デフォルト引数を用いて


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


no = a;

tate = b;

yoko = c;

takasa = d;


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


}


として


cube1のオブジェクト宣言


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


を実行すると




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


Cube::Cube(int a=0, float b=0.0, float c=0.0, float d=0.0) の定義内の


no = a;

tate = b;

yoko = c;

takasa = d;

no

tate

yoko

takasa



クラスCube型のオブジェクトcube1のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa


が代入された


cube1.no=a;

cube1.tate=b;

cube1.yoko=c;

cube1.takasa=d;


が実行されることになる


このとき


デフォルト引数の設定


int a=0, float b=0.0, float c=0.0, float d=0.0


により


cube1.no=0;

cube1.tate=0.0;

cube1.yoko=0.0;

cube1.takasa=0.0;


となり

cube1.no

cube1.tate

cube1.yoko

cube1.takasa



0

0.0

0.0

0.0


に初期化されるはずなんだが


cube1のオブジェクト宣言


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


の引数部分の設定により


aに1

bに1.0

cに1.0

dに1.0

が代入されることになるとすると


クラスCube型のオブジェクトcube1のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

1

1.0

1.0

1.0

の値を持つことになる


いったい


クラスCube型のオブジェクトcube1のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

0

0.0

0.0

0.0


の値をとることになるのか??


それとも


1

1.0

1.0

1.0

の値をもつことになるのか?」



ソーラー「わ、いいところにきづいたね。


実は


コンストラクタの引数をデフォルト引数に設定して数値データを代入しておいたとしても


オブジェクト宣言が実行されるとき


オブジェクトにつづく引数部分に代入される数値データを


オブジェクトのメンバ変数はもつことになります。


とりあえず


コンストラクタCube(int a,float b,float c,float d)の定義を


デフォルト引数を用いて


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


no = a;

tate = b;

yoko = c;

takasa = d;


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


}


とし


main関数内で


cube1のオブジェクト宣言


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


を実行してみましょう。


さあ 


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

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

0

0.0

0.0

0.0


の値をもつことになるのかな?


それとも


1

1.0

1.0

1.0

の値をもつことになるのかな?」



#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);

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



public:

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


};


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


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型のオブジェクト宣言をおこなっています

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


コンストラクタCube(int a,float b,float c,float d)の定義内の


no = a;

tate = b;

yoko = c;

takasa = d;

no

tate

yoko

takasa



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

cube1.no

cube1.tate

cube1.yoko

cube1.takasa


が代入された


cube1.no=a;

cube1.tate=b;

cube1.yoko=c;

cube1.takasa=d;


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


そして


デフォルト引数の設定


int a=0, float b=0.0, float c=0.0, float d=0.0


により


cube1.no=0;

cube1.tate=0.0;

cube1.yoko=0.0;

cube1.takasa=0.0;


が実行され


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

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

0

0.0

0.0

0.0

の値をもつことになりそうですが


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


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


により


aに1

bに1.0

cに1.0

dに1.0

が代入されることになるので


クラスCube型のオブジェクト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型のオブジェクトcube1のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

1

1.0

1.0

1.0


をあらわすことになったか~い


コンストラクタの定義


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


no = a;

tate = b;

yoko = c;

takasa = d;


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


}



引数をデフォルト引数に設定していたが


結局


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


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


により


int a

float b

float c

float d

に代入される値は


0

0.0

0.0

0.0

でなく


1

1.0

1.0

1.0

になって


クラスCube型のオブジェクトcube1のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

1

1.0

1.0

1.0

をあらわすことになったか・・・


ということは


コンストラクタの引数を


デフォルト引数に設定することに意味はないんじゃないか・・・


と思うんだが?」



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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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