🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
クラスのメンバ関数であるクラスのコンストラクタを2つ設定して2つの異なるオブジェクトを作成してみよう 別の方法でオブジェクトのコンストラクタを呼び出してみる
クラスのメンバ関数であるクラスのコンストラクタを2つ設定して2つの異なるオブジェクトを作成してみよう 別の方法でオブジェクトのコンストラクタを呼び出してみる
ソーラー「
以下のように
オブジェクトcube1を作製する
cube1のオブジェクト宣言
Cube cube1;
と
オブジェクトcube2を作製する
cube2のオブジェクト宣言
Cube cube2(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();
//🌞🌞🌞コンストラクタ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, float b, float c, float d) {
no = a;
tate = b;
yoko = c;
takasa = d;
cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";
}
/*👆🌞🌞🌞コンストラクタ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;
Cube cube2(1,1.0,1.0,1.0);
/*🌞🌞🌞cube1とcube2のクラスCube型のオブジェクト宣言をおこなっています
ビルド実行結果はどうなるのでしょうか🌞🌞🌞*/
cout << "立方体につけられたナンバーは" << cube1.no << "です" << "\n";
cout << "立方体の縦の長さは" << cube1.tate << "です" << "\n";
cout << "立方体の横の長さは" << cube1.yoko << "です" << "\n";
cout << "立方体の高さの長さは" << cube1.takasa << "です" << "\n";
cout << "立方体につけられたナンバーは" << cube2.no << "です" << "\n";
cout << "立方体の縦の長さは" << cube2.tate << "です" << "\n";
cout << "立方体の横の長さは" << cube2.yoko << "です" << "\n";
cout << "立方体の高さの長さは" << cube2.takasa << "です" << "\n";
return 0;
}
ビルド実行結果
生成されたオブジェクトのメンバ変数を初期化しました
生成されたオブジェクトのメンバ変数を初期化しました
立方体につけられたナンバーは0です
立方体の縦の長さは0です
立方体の横の長さは0です
立方体の高さの長さは0です
立方体につけられたナンバーは1です
立方体の縦の長さは1です
立方体の横の長さは1です
立方体の高さの長さは1です
マックス「ちゃんと
cube1とcube2のオブジェクト宣言
Cube cube1;
Cube cube2(1,1.0,1.0,1.0);
が
実行できているじゃないか(*^_^*)
いい感じじゃないか
しかも
オブジェクトcube1のコンストラクタ
と
オブジェクトcube2のコンストラクタ
が実行されて
ビルド実行結果の始めに
生成されたオブジェクトのメンバ変数を初期化しました
生成されたオブジェクトのメンバ変数を初期化しました
が表示され
オブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
が
0
0.0
0.0
0.0
に
オブジェクトcube2のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
が
1
1.0
1.0
1.0
に
初期化されている。
同時に
2つの異なるオブジェクトのオブジェクト宣言は可能ってわけだ。」
ソーラー「ここで
cube1とcube2のオブジェクト宣言
Cube cube1;
Cube cube2(1,1.0,1.0,1.0);
に
ご注目下さい」
solarplexuss
「注目しましたP。」
ソーラー「
cube1とcube2のオブジェクト宣言
Cube cube1;
Cube cube2(1,1.0,1.0,1.0);
を
実行すれば
オブジェクトcube1のコンストラクタ
と
オブジェクトcube2のコンストラクタ
が実行されました。
つまり
オブジェクト宣言によって
オブジェクトのコンストラクタが自動的に実行されたというわけです。
ここで
cube1とcube2のオブジェクト宣言
Cube cube1;
Cube cube2(1,1.0,1.0,1.0);
を実行する以外にも
オブジェクトcube1のコンストラクタ
と
オブジェクトcube2のコンストラクタ
を呼び出して実行する方法があります。
具体的には
cube1とcube2のオブジェクト宣言
Cube cube1;
Cube cube2(1,1.0,1.0,1.0);
のかわりに
Cube cube1=Cube();
Cube cube2=Cube(1,1.0,1.0,1.0);
と記述する方法です。
マックス「?????
cube1のオブジェクト宣言
Cube cube1;
を実行したら
自動的にクラスのコンストラクタ
Cube::Cube() {
no = 0;
tate = 0.0;
yoko = 0.0;
takasa = 0.0;
cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";
}
が採用され
オブジェクトcube1のコンストラクタ
が実行されるから
Cube cube1=Cube();
と記述しなくてもいいんじゃないか?」
ソーラー「びくっ そうなんです。
さらに
cube2のオブジェクト宣言
Cube cube2(1,1.0,1.0,1.0);
を実行すれば
自動的にクラスのコンストラクタ
Cube::Cube(int a, float b, float c, float d) {
no = a;
tate = b;
yoko = c;
takasa = d;
cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";
}
が採用され
オブジェクトcube2のコンストラクタが実行されることになるので
Cube cube2=Cube(1,1.0,1.0,1.0);
を実行しなくてもよいということになります」
マックス「この記述方法
👇
Cube cube1=Cube();
Cube cube2=Cube(1,1.0,1.0,1.0);
はマニアックに
オブジェクトのコンストラクタを実行したい方向け
というわけなのか?」
ソーラー「う~ん
ぼくが思うに
よく使われる
Cube cube1;
Cube cube2(1,1.0,1.0,1.0);
よりも
Cube cube1=Cube();
Cube cube2=Cube(1,1.0,1.0,1.0);
の方が
正式な
オブジェクト宣言なんじゃないかな
と思うんだ。
なんでかっていうと
Cube cube1=Cube();
Cube cube2=Cube(1,1.0,1.0,1.0);
の表記法では
クラスのどのコンストラクタが
オブジェクトのコンストラクタとして採用されるか
分かりやすいし
Cube cube2(1,1.0,1.0,1.0);
では
そもそも
自作関数でないオブジェクトcube2に
引数部(1,1.0,1.0,1.0)がつくことになりますからね。
でも
Cube cube1;
Cube cube2(1,1.0,1.0,1.0);
のほうが
よくつかわれているんだよ。
一応
Cube cube1=Cube();
Cube cube2=Cube(1,1.0,1.0,1.0);
👆のような
オブジェクト宣言の表記方法もしっておくと
もしこれらの表記法にでくわしたとき
焦らずにすむというわけかな?
では
先ほどのプログラムのオブジェクト宣言
Cube cube1;
Cube cube2(1,1.0,1.0,1.0);
の部分を
Cube cube1=Cube();
Cube cube2=Cube(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();
//🌞🌞🌞コンストラクタ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, float b, float c, float d) {
no = a;
tate = b;
yoko = c;
takasa = d;
cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";
}
/*👆🌞🌞🌞コンストラクタ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 = Cube();
Cube cube2 = Cube(1, 1.0, 1.0, 1.0);
/*👆
Cube cube1;
Cube cube2(1, 1.0, 1.0, 1.0);
とは
別のタイプの
cube1とcube2のクラスCube型のオブジェクト宣言をおこなっています
ビルド実行結果はどうなるのでしょうか🌞🌞🌞*/
cout << "立方体につけられたナンバーは" << cube1.no << "です" << "\n";
cout << "立方体の縦の長さは" << cube1.tate << "です" << "\n";
cout << "立方体の横の長さは" << cube1.yoko << "です" << "\n";
cout << "立方体の高さの長さは" << cube1.takasa << "です" << "\n";
cout << "立方体につけられたナンバーは" << cube2.no << "です" << "\n";
cout << "立方体の縦の長さは" << cube2.tate << "です" << "\n";
cout << "立方体の横の長さは" << cube2.yoko << "です" << "\n";
cout << "立方体の高さの長さは" << cube2.takasa << "です" << "\n";
return 0;
}
ビルド実行結果
生成されたオブジェクトのメンバ変数を初期化しました
生成されたオブジェクトのメンバ変数を初期化しました
立方体につけられたナンバーは0です
立方体の縦の長さは0です
立方体の横の長さは0です
立方体の高さの長さは0です
立方体につけられたナンバーは1です
立方体の縦の長さは1です
立方体の横の長さは1です
立方体の高さの長さは1です
ソーラー「オブジェクト宣言を
Cube cube1;
Cube cube2(1,1.0,1.0,1.0);
から
Cube cube1=Cube();
Cube cube2=Cube(1,1.0,1.0,1.0);
に変更しても
同じビルド結果が得られましたね。」
マックス「ソーラーよ
もしかしたら
2つのcube1のオブジェクト宣言
Cube cube1;
Cube cube1(1,1.0,1.0,1.0);
は実行できなかったが
今の記述方法を用いた
2つのcube1のオブジェクト宣言
Cube cube1=Cube();
Cube cube1=Cube(1,1.0,1.0,1.0);
は実行できるんじゃないか?」
ソーラー「?
同じ名前の変数宣言を2回実行することができないように
cube1のCube型のオブジェクト宣言
を
2回行うことになるので
オブジェクトcube1が再定義されています
とビルドエラーが生じるんじゃないかな?
とおもいますが( ^ω^)・・・」
マックス「よし てんC
オブジェクト宣言
Cube cube1=Cube();
Cube cube1=Cube(1,1.0,1.0,1.0);
をもちいた
プログラムを実行だ」
てんC「はい それでは😊
オブジェクト宣言
Cube cube1=Cube();
Cube cube1=Cube(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();
//🌞🌞🌞コンストラクタ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, float b, float c, float d) {
no = a;
tate = b;
yoko = c;
takasa = d;
cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";
}
/*👆🌞🌞🌞コンストラクタ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 = Cube();
Cube cube1 = Cube(1, 1.0, 1.0, 1.0);
/*🌞🌞🌞cube1のクラスCube型のオブジェクト宣言を
2つおこなっています
ビルド実行結果はどうなるのでしょうか🌞🌞🌞*/
cout << "立方体につけられたナンバーは" << cube1.no << "です" << "\n";
cout << "立方体の縦の長さは" << cube1.tate << "です" << "\n";
cout << "立方体の横の長さは" << cube1.yoko << "です" << "\n";
cout << "立方体の高さの長さは" << cube1.takasa << "です" << "\n";
cout << "立方体につけられたナンバーは" << cube2.no << "です" << "\n";
cout << "立方体の縦の長さは" << cube2.tate << "です" << "\n";
cout << "立方体の横の長さは" << cube2.yoko << "です" << "\n";
cout << "立方体の高さの長さは" << cube2.takasa << "です" << "\n";
return 0;
}
ビルド実行結果
エラー C2374 'cube1': 再定義されています。2 回以上初期化されています。
マックス「おしいな
実行できないか・・・」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます