変換コンストラクタについて学ぶ前にコンストラクタのおさらいをしてみましょう
🌞 🌞 🌞 🌞 🌞 🌞 🌞
さてさて 次は変換コンストラクタというものについて学んでみようよ
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「んん?変換コンストラクタ?
それは、なんなのだ?
なんか変換するのか?」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
クラスのメンバ関数である
クラスのコンストラクタ
オブジェクトのメンバ関数である
オブジェクトのコンストラクタはみんな知っているとして・・・
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「・・・すまない・・・記憶にない・・・」
ソーラー「あぅ 僕もだ」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
では おさらいといこうよ いこうよ
マックスさん
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「やってやるぜ」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
オブジェクトを生成したなら
オブジェクトのメンバ変数
オブジェクトのメンバ関数が生成されましたね
そして
オブジェクトのメンバ関数が実行されるとき
クラスのメンバ関数の定義内の命令文が実行されるのですが
そのとき
クラスのメンバ関数の定義の中で用いられている
クラスのメンバ変数に
オブジェクトのメンバ変数が代入されたものが
実行されるのでした
そして
コンストラクタとはクラスのメンバ関数であり
オブジェクトを生成したとき
自動的に
オブジェクトのコンストラクタが実行されることになります
オブジェクトのコンストラクタが実行されるとき
クラスのメンバ関数であるコンストラクタの定義内の命令文が実行されるのですが
そのとき
クラスのメンバ関数であるコンストラクタの定義の中で用いられている
クラスのメンバ変数に
オブジェクトのメンバ変数が代入されたものが
実行されるのでした
🥕オブジェクトのコンストラクタとは🥕
🍎オブジェクトが生成されたときに自動的に実行される🍎
🍎オブジェクトのメンバ関数のことなんです🍎
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「おお。。。うう・・・」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
とりあえず
コンストラクタが用いられた次のプログラムをご覧くださいな
👇
#include <iostream>
using namespace std;
class Suuti{
public:
int x;
public:
void suutidisplay();
public:
Suuti();//🌞コンストラクタのメンバ関数宣言です
};
void Suuti::suutidisplay() {
cout << x << "\n";
}
Suuti::Suuti(){
cout <<"コンストラクタが実行されました" << "\n";
}
int main() {
Suuti a;
a.x = 1;
a.suutidisplay();
return 0;
}
プログラムの実行結果
コンストラクタが実行されました
1
マックス「コンストラクタが実行されました・・・か
あっ なんかわかったかも・・・
Suutiのクラス宣言内で
自作関数Suuti()の
クラスSuutiのメンバ関数宣言
Suuti();
が設定されているが
この自作関数Suuti()が
コンストラクタってわけだ
そして
aのクラスSuuti型のオブジェクト宣言
Suuti a;
が実行されたと同時に
コンストラクタである自作関数Suuti()の定義
👇
Suuti::Suuti(){
cout <<"コンストラクタが実行されました" << "\n";
}
の
cout <<"コンストラクタが実行されました" << "\n";
が実行されるので
コマンドプロンプト画面に
コンストラクタが実行されました
が表示されたというわけだ
そういや コンストラクタとはそういうものだったか
そして
クラスSuutiのクラス宣言内で
コンストラクタである自作関数Suuti()の
クラスSuutiのメンバ関数宣言
Suuti();
が実行されているが
このクラスSuutiのメンバ関数Suuti()には
戻り値を格納する型が設定されていない・・・
このように
クラスSuutiのメンバ関数である
自作関数であるコンストラクタの名前は
クラス名であるSuutiが用いられ
戻り値を格納する型は設定しないのだったな😊」
ソーラー「そして
コンストラクタは自作関数なので
どのようにコンストラクタ
つまり
自作関数の定義
を
設定するかは自由なんだね 」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
そうなの
そして
引数を持たないタイプの
クラスSuutiのコンストラクタだけでなく
引数を持つタイプの
クラスSuutiのコンストラクタを設定することもできます
例えば
Suutiのクラス宣言内で
コンストラクタである自作関数Suuti(int b)の
クラスSuutiのメンバ関数宣言
Suuti(int b);
を実行し
コンストラクタである自作関数Suuti(int b)の定義を
Suuti::Suuti(int b){
cout <<"コンストラクタが実行されました" << "\n";
x=b;
cout<<"オブジェクトのメンバ変数は"<<b<<"に初期化されました"<<"\n";
}
と設定することができます
この
コンストラクタである自作関数Suuti(int b)が用いられたプログラムは
次のようになります
👇
#include <iostream>
using namespace std;
class Suuti{
public:
int x;
public:
void suutidisplay();
public:
Suuti(int b);
};
void Suuti::suutidisplay() {
cout << x << "\n";
}
Suuti::Suuti(int b) {
cout << "コンストラクタが実行されました" << "\n";
x = b;
cout << "オブジェクトのメンバ変数は" << b << "に初期化されました" << "\n";
}
int main() {
Suuti a(1);//🌞aのクラスSuuti型のオブジェクト宣言です オブジェクトaに引数部分がくっついています
a.suutidisplay();
return 0;
}
プログラムの実行結果
コンストラクタが実行されました
オブジェクトのメンバ変数は1に初期化されました
1
このプログラムでは
aのクラスSuuti型のオブジェクト宣言
Suuti a(1);
が実行されています
この
aのクラスSuuti型のオブジェクト宣言
Suuti a(1);
が実行されると
クラスSuuti型のオブジェクトaが生成されるのですが
同時に
クラスSuuti型のオブジェクトaのメンバ関数である
クラスSuuti型のオブジェクトaのコンストラクタが実行されることになります
つまり
クラスSuutiのメンバ関数であるコンストラクタSuuti(int b)の定義
👇
Suuti::Suuti(int b) {
cout << "コンストラクタが実行されました" << "\n";
x = b;
cout << "オブジェクトのメンバ変数は" << b << "に初期化されました" << "\n";
}
の
int bに1が代入された
cout << "コンストラクタが実行されました" << "\n";
x =1;
cout << "オブジェクトのメンバ変数は" <<1<< "に初期化されました" << "\n";
が実行されることになります
正確には
クラスSuuti型のオブジェクトaのメンバ関数である
クラスSuuti型のオブジェクトのコンストラクタが実行されるので
👇
cout << "コンストラクタが実行されました" << "\n";
x =1;
cout << "オブジェクトのメンバ変数は" <<1<< "に初期化されました" << "\n";
👆
の
クラスSuutiのメンバ変数
x
に
クラスSuuti型のオブジェクトaのメンバ変数
a.x
が代入された
cout << "コンストラクタが実行されました" << "\n";
a.x=1;
cout << "オブジェクトのメンバ変数は" <<1<< "に初期化されました" << "\n";
が実行されることになります
ですので
コンストラクタが実行されました
オブジェクトのメンバ変数は1に初期化されました
が
コマンドプロンプト画面に表示されることになります
そして
クラスSuuti型のオブジェクトaのメンバ変数
a.x
には
1
が代入されているので
a.suutidisplay();
の実行結果は
1
となるわけなのですね
きゃは😊
🌞 🌞 🌞 🌞 🌞 🌞 🌞
ソーラー「aのクラスSuuti型のオブジェクト宣言
Suuti a(1);
の形式は
aに(1)がくっついた
普通のオブジェクト宣言とはちょっと違った形式だけど
なぜこうなっているのかというと
aのクラスSuuti型のオブジェクト宣言
Suuti a(1);
を実行したとき
同時に実行される
クラスSuuti型のオブジェクトaのメンバ関数である
クラスSuuti型のオブジェクトaのコンストラクタの引数に
数値1を代入して
実行するために
aに(1)
が
くっ付いているんだね 」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
今度は
クラスSuutiのクラス宣言内で
コンストラクタである自作関数Suuti(int b)のクラスSuutiのメンバ関数宣言
Suuti(int b);
を記述し
コンストラクタである自作関数Suuti(int b)の定義を
Suuti::Suuti(int b){
x=b;
}
と設定してみます
それでは
このコンストラクタである自作関数Suuti(int b)が用いられた
プログラムを実行してみたいと思います
そのプログラムはこちらです
#include <iostream>
using namespace std;
class Suuti {
public:
int x;
public:
void suutidisplay();
public:
Suuti(int b);
};
void Suuti::suutidisplay() {
cout << x << "\n";
}
Suuti::Suuti(int b) {
x = b;
}
int main() {
Suuti a(1);
a.suutidisplay();
return 0;
}
プログラムの実行結果
1
このプログラムでは
aのクラスSuuti型のオブジェクト宣言
Suuti a(1);
が実行されています
この
aのクラスSuuti型のオブジェクト宣言
Suuti a(1);
が実行されると
クラスSuuti型のオブジェクトaが生成されるのですが
同時に
クラスSuuti型のオブジェクトaのメンバ関数である
クラスSuuti型のオブジェクトaのコンストラクタが実行されることになります
つまり
クラスSuutiのメンバ関数であるコンストラクタSuuti(int b)の定義
👇
Suuti::Suuti(int b) {
x = b;
}
の
int bに1が代入された
x =1;
が実行されることになります
正確には
クラスSuuti型のオブジェクトaのメンバ関数である
クラスSuuti型のオブジェクトaのコンストラクタが実行されるので
x =1;
の
クラスSuutiのメンバ変数
x
に
クラスSuuti型のオブジェクトaのメンバ変数
a.x
が代入された
a.x=1;
が実行されることになります
クラスSuuti型のオブジェクトaのメンバ変数
a.x
には
1
が代入されているので
a.suutidisplay();
の実行結果は
1
となっています・ね🌞
🐨
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「おお~いいな~
これは簡単
今のプログラムで用いられているコンストラクタは
さっきのコンストラクタの定義内容をみじかくしたものだな」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
で・す・よ・ね😊
ここで
今のプログラムの
Suuti a(1);
を
Suuti a=1;
に変換したものを実行できるかどうか確かめてみたいと思います
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「ぬあにぃ なんでぇ?
さすがに
Suuti a=1;
は
実行できないんじゃないか?
大体クラスSuuti型のオブジェクトaに
1
を代入することなんてできないんじゃないか?
そういうことやってくるかぁ ふつう?」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます