クラスのメンバ関数であるクラスのコンストラクタを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 回以上初期化されています。



マックス「おしいな


実行できないか・・・」







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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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