クラス型のオブジェクトのコンストラクタが実行される様子を観察してみます。

ソーラー「Cubeのクラス宣言内で


自作関数であるクラスCubeのコンストラクタのメンバ関数宣言が記述されているとします。


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


Cube cube1;


が実行されると


つまり


クラスCube型のオブジェクトcube1が作製されると


クラスCube型のオブジェクトcube1のメンバ関数である


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


自動的に実行されます」


マックス「みゃあ


自作関数であるクラスCubeのコンストラクタの定義は



Cube::Cube() {


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


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

}



なんだろう。



☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆


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


クラスCubeのメンバ関数となっていることは


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


クラスCubeのメンバ関数であることを示すCube::



Cube()


にくっついていることからもわかりますね。


☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆


cube1のオブジェクト宣言


Cube cube1;


が実行されて


クラスCube型のオブジェクトcube1が作製されて


クラスCube型のオブジェクトcube1のメンバ関数である


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


何が実行されるんだ??」


ソーラー「そうですね


とりあえず


以下のプログラムを参照しながら


クラスCube型のオブジェクトcube1のメンバ関数である


クラスCube型のオブジェクトcube1のコンストラクタが実行される様子を観察してみましょう。


#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です


ソーラー「


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


Cube cube1;


が実行されて



クラスCube型のオブジェクトcube1が作製されると


クラスCube型のオブジェクトcube1のメンバ関数である


クラスCube型のオブジェクトcube1のコンストラクタが自動的に実行されます。


コンストラクタの定義は


Cube::Cube() {


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


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

}


となっています。」


マックス「このコンストラクタは


Cube::Cube()


をみてもわかるように


()内に引数をもっていない・・・のか???」


ソーラー「


()に何も記述されていないので


引数をもっていません。」


マックス「でもぉん


コンストラクタの定義内で


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


と記述されているだろ


この変数


no

tate

yoko

takasa


コンストラクタの引数なんじゃないか?」


ソーラー「いえ 引数ではありません。」


マックス「なしてぇぇぇ」


ソーラー「なしてもです」


マックス「なじぇぇ」


ソーラー「いえ 引数ではありません。」


てんC「たとえば


自作関数newmadefunctionが引数を持つ場合


void newmadefunction(int a,int b){


cout<<a<<"が代入されました\n";

cout<<b<<"が代入されました\n";

}


のように


変数宣言

int a

int b

が()内に引数として記述されます。


void newmadefunction(){

int a=1;

int b=5;

cout<<a<<"が代入されました\n";

cout<<b<<"が代入されました\n";

};


のように


変数宣言が()内に引数として記述されていない場合は


引数を持たないことになります。


つまり


自作関数newmadefunctionが引数を持つ場合


newmadefunction(1,5);


のように


引数部分に数値データを代入して自作関数newmadefunctionを実行することができるのですが


自作関数newmadefunctionが引数を持たない場合は


newmadefunction();


のように


自作関数を実行することになります。


つまり 


引数部分に数値データを代入して自作関数を実行することはできません。」



ソーラー「そして


このときの


クラスCubeのメンバ関数であるコンストラクタの定義は


Cube::Cube() {


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


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

}


となっていて


Cube::Cube() {


int no;👈ココです

float tate;👈ココです

float yoko;👈ココです

float takasa; 👈ココです


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


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

}



👇ここです

Cube::Cube(int no,float tate,float yoko,float takasa) {


float takasa

no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


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

}



のように変数宣言

int no;

float tate;

float yoko;

float takasa;

が記述されていないね。



それは


変数

no

tate

yoko

takasa


はすでに


クラスのメンバ変数宣言


public:

int no; //変数noはクラスCubeのメンバ変数とよばれます

public:

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

public:

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

public:

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます




変数宣言されているので


再びコンストラクタの定義内で


int no;

float tate;

float yoko;

float takasa;

を記述する必要はないというわけなんだね。」


マックス「おおお なんか お・し・い・・・


分かりそうな気がする・・・」



てんC「cube1のクラスCube型のオブジェクト宣言


Cube cube1;


が実行されて


クラスCube型のオブジェクトcube1が作製されるとき


自動的に


クラスCube型のオブジェクトcube1のメンバ関数である


クラスCube型のオブジェクトcube1のコンストラクタが実行されることになります。


コンストラクタの定義は


Cube::Cube() {


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


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

}


となっています。


クラスCube型のオブジェクトcube1が作製されるとき


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


コンストラクタの定義内の


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


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



がそのまま実行されるのではありません。


☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆


🌞オブジェクトcube1が作製されるとき🌞


自動的に


クラスCube型のオブジェクトcube1のメンバ関数である


クラスCube型のオブジェクトcube1のコンストラクタが実行されることになります


☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆


👆とあるように


          🌞クラスCube型のオブジェクトcube1が作製されると🌞


自作関数であるコンストラクタの定義内の


no

tate

yoko

takasa


の部分に


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

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

が代入された



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


つまり


cube1.no=0;

cube1.tate=0.0;

cube1.yoko=0.0;

cube1.takasa =0.0;

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



実行されることになります。


すると


プログラムの実行結果の


最初の行に


生成されたオブジェクトのメンバ変数を初期化しました


表示されることになりますね。



繰り返しますと



          🍓クラスCube型のオブジェクトcube1のメンバ関数である🍓


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



クラスのメンバ関数であるコンストラクタの定義

👇

Cube::Cube() {


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


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

}

👆


no = 0;

tate = 0.0;

yoko = 0.0;

takasa = 0.0;


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



no

tate

yoko

takasa

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

cube1.no

cube1.tate

cube1.yoko

cube1.takasa


が代入されたものが実行されるということなのです。


ですから    


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


             Cube cube1;


が実行されて


              🍓自動的に🍓


🍓オブジェクトcube1のメンバ関数である🍓


🍓オブジェクトcube1のコンストラクタが実行されると🍓



cube1.no=0;

cube1.tate=0.0;

cube1.yoko=0.0;

cube1.takasa=0.0;


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


が実行されることになります。


いま先程のプログラムでは


次に


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


cube1.display();


が実行されます。


クラスCubeのメンバ関数display()の定義は


void Cube::display() {


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

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

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

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


}


となっていますが


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


cube1.display();


が実行される際には


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

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

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

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

no

tate

yoko

takasa

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

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

が代入された


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

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

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

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


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



つまり


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


が実行されるとき


🌞クラスCube型のオブジェクトcube1のメンバ変数が代入されたクラスCubeのメンバ関数🌞



実行されるというわけです。




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


cube1.display();


が実行される前に


クラスCube型のオブジェクトcube1のメンバ関数である


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


cube1.no=0;

cube1.tate=0.0;

cube1.yoko=0.0;

cube1.takasa =0.0;


が実行されているので


cube1.display();


が実行されると


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

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

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

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


cube1.no

cube1.tate;

cube1.yoko;

cube1.takasa

0

0.0

0.0

0.0

が代入されたものが実行されて


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


cube1.display();



プログラムの実行結果は


立方体につけられたナンバーは0です

立方体の縦の長さは0です

立方体の横の長さは0です

立方体の高さの長さは0です


となります。


main関数内で


cube1.display();


につづく命令文


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

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

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

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


の実行結果も


クラスCube型のオブジェクトcube1のメンバ関数である


クラスCube型のオブジェクトcube1のコンストラクタの実行により



cube1.no=0;

cube1.tate=0.0;

cube1.yoko=0.0;

cube1.takasa =0.0;


が実行されているので


プログラムの実行結果


立方体につけられたナンバーは0です

立方体の縦の長さは0です

立方体の横の長さは0です

立方体の高さの長さは0です



表示されることになります😊」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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