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

ソーラー「



クラスCubeのコンストラクタの定義が


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


no = a;

tate = b;

yoko = c;

takasa = d;


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


}

のように


引数がデフォルト引数に設定されていない場合



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


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


のように


cube1(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::Cubeの定義で


引数が


int a = 0

float b = 0.0

float c = 0.0

float d = 0.0

のように


デフォルト引数に設定されている場合では


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


のタイプの


クラスCube型のオブジェクト宣言を実行することもできるし


Cube cube1;


のタイプの


クラスCube型のオブジェクトcube1に引数部分が設定されていない


クラスCube型のオブジェクト宣言を実行することもできます



このとき


       💖引数部分を持たないオブジェクト宣言💖


Cube cube1;


を実行すれば



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


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


そのとき


クラス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";


}



no

tate

yoko

takasa



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

cube1.no

cube1.tate

cube1.yoko

cube1.takasa


が代入されたものが実行されることになります。


no

tate

yoko

takasa



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


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


をあらわすことになるというわけです。


ですので


no = a;

tate = b;

yoko = c;

takasa = d;



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のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa


には

0

0.0

0.0

0.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;


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


}


のように引数をデフォルト引数に設定すると


Cube cube1;


のようなオブジェクトに引数部分のないオブジェクト宣言を実行できるというわけだ


引数を


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


no = a;

tate = b;

yoko = c;

takasa = d;


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


}


のように


デフォルト引数に設定していないと


オブジェクト宣言は


オブジェクトに引数部分がついた


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


のようなタイプのオブジェクト宣言しか実行できないわけか


そういうことか・・・


クラスのコンストラクタの引数をデフォルト引数に設定するのは


まったく意味がないというわけではないわけか(*^▽^*)」



ところで


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


Cube(int a=2 , float b=2.0 , float c =2.0, float d=2.0 )

の定義を

👇

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


no = a;

tate = b;

yoko = c;

takasa = d;


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


}


のように


int a

float b

float c

float d


int a=2

float b=2.0

float c=2.0

float d=2.0


とデフォルト引数に設定した場合


オブジェクトcube1に引数部分をもつ


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


のタイプの


オブジェクト宣言を実行することもできるし


Cube cube1;


のタイプの


オブジェクトcube1に引数部分が設定されていない


オブジェクト宣言を実行することもできるんだが


もし

Cubeのクラス宣言内で


2つの


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


Cube();


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


が設定され


そのうち


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


Cube()の定義



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)の定義



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


no = a;

tate = b;

yoko = c;

takasa = d;


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


}


に設定されているとするだろう。


そのとき


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


Cube cube1;


を実行して


クラスCube型のオブジェクトcube1を作製したなら


どっちの


コンストラクタを用いて


クラスCube型のオブジェクトcube1のコンストラクタが実行されるんだ?



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


Cube cube1;


を実行して


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


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


が生成される際


普通は


引数を持たないほうのコンストラクタCube()の定義


Cube::Cube() {


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


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


}



no

tate

yoko

takasa


cube1.no

cube1.tate

cube1.yoko

cube1.takasa

が代入されたものが実行されるだろう。


つまり


オブジェクトcube1のコンストラクタCube()


が実行されるわけだが



だがしかし



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


Cube(int a, float b, float c, float d)の定義が

👇


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


no = a;

tate = b;

yoko = c;

takasa = d;


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


}

👆

のように


int a

float b

float c

float d

デフォルト引数

int a=2;

float b=2.0;

float c=2.0;

float d=2.0:

に設定されていると


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


Cube cube1;


を実行して


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


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


が生成される際


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


Cube(int a, float b, float c, float d)の定義

👇


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


no = a;

tate = b;

yoko = c;

takasa = d;


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


}


a

b

c

d


2

2.0

2.0

2.0


no

tate

yoko

takasa


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


が代入されたものが実行されるだろう。


つまり


クラスCube型のオブジェクトcube1のコンストラクタ


Cube::Cube(int a=2 , float b=2.0 , float c =2.0, float d=2.0 )


が実行されるわけだ


まさか


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


Cube cube1;


を実行すると


クラスCube型のオブジェクトcube1のコンストラクタCube()


クラスCube型のオブジェクトcube1のコンストラクタCube::Cube(int a=2 , float b=2.0 , float c =2.0, float d=2.0 )


の両方が実行されるのか?


ふっ( ̄ー ̄)ニヤリ


どうだ 俺 目立っただろう」


ソーラー「読者のみんな ドン引きしてますよ・・・」


てんC「はい それでは😊


Cubeのクラス宣言内で


2つの


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


Cube();


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


を設定し


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


Cube()の定義



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)の定義



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


no = a;

tate = b;

yoko = c;

takasa = d;


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


}


に設定し


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


Cube cube1;


を実行してみます。


このとき


クラスCube型のオブジェクトcube1のコンストラクタCube()

が実行されるのでしょうか?


それとも


クラスCube型のオブジェクトcube1のコンストラクタCube(int a=2 , float b=2.0 , float c =2.0, float d=2.0 )

が実行されるのでしょうか?


それとも


クラスCube型のオブジェクトcube1のコンストラクタCube()


クラスCube型のオブジェクトcube1のコンストラクタCube(int a=2 , float b=2.0 , float c =2.0, float d=2.0 )

の両方が実行されるのでしょうか?


そのプログラムはこちらで~す(*^_^*)


#include <iostream>


using namespace std;


class Cubedatadisplay {


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=2, float b=2.0, float c=2.0, float d=2.0) {


no = a;

tate = b;

yoko = c;

takasa = d;


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


}

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



void Cube::display() {


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

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

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

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


}


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




int main() {


Cube cube1;

return 0;

}



プログラムの実行結果



エラー (アクティブ) E0339 クラス "Cube" には既定のコンストラクターが複数あります

エラー C2668 'Cube::Cube': オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照)


てんC「正解は


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


Cube cube1;


を実行して


自動的に


クラスCube型のオブジェクトのコンストラクタが実行される際


実行可能なクラスCube型のオブジェクトのコンストラクタが複数あると


ビルド実行エラーが表示される


でした。


クラスCube型のオブジェクトcube1のコンストラクタCube()


クラスCube型のオブジェクトcube1のコンストラクタCube(int a=2, float b=2.0, float c=2.0, float d=2.0)


の両方とも実行されない


のですね。」


          チャン  チャン

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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