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