コンストラクタの引数にデフォルト引数をもちいてみよう。 その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)
の両方とも実行されない
のですね。」
チャン チャン
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます