「C++言語」の「コンストラクタ」の仕組みと使い方
今回は「コンストラクタ」等の機能について学んでいきたいと思います。
「C++言語」のクラスはいろいろな仕様や機能がたくさんあって覚えるのが大変だと聞いていたので、マイペースで少しずつ覚えていきたいと思います。
記憶力が弱いのが、プログラミング学習の一番の課題かも・・・
コンストラクタの仕組みと作り方
「コンストラクタ」は、「オブジェクトの初期化処理」を行うことができる仕組みなのですが、「メンバ」に初期値を設定することなどができるようになります。
「コンストラクタ」の定義方法は、
クラス名 (引数・・・){ // オブジェクトが作られた際に実行する処理 }
のようになります。
今回は少し内容を変えて、「食材」を元にクラスを作ってみたいと思います。
#include <iostream> #include <string> using namespace std; //「Food」クラスを定義 class Food { public: string foodType; // 食材の種類 int price; // 食材の価格 // コンストラクタ Food(string food_type_val, int price_val){ foodType = food_type_val; price = price_val; } //画面表示用メンバ関数 void displayData(){ string str = "type=" + this->foodType + " price=" + std::to_string(this->price); cout << str << endl; } }; int main() { // コンストラクタを利用 Food ft1 = Food("beef_meet_300gram", 1000); // 標準出力に文字列を出力 ft1.displayData(); return 0; }
このプログラムを実行すると、
type=beef_meet_300gram price=1000
のように表示されます。
「コンストラクタ」は「関数」のように「戻り値」を返すことができないので、「引数」に値を渡すことしかできないという制約があります。
今までの書き方と比べると「プログラムの行数が短くなる」ので、メリットも大きそうですね。
デフォルトコンストラクタ
「引数が無いコンストラクタ」のことを「デフォルトコンストラクタ」ですが、「初期化する値」を渡さなくても「コンストラクタ」を作ることができる仕組みのことを言うそうです。
ただ、もし自分でコンストラクタを作ってしまうと、「デフォルトコンストラクタ」は自動で作られないとのことでした。
この「コンストラクタ」は自分で作ることもでき、例えば、先ほどの「Food」クラスを例にしてみると、
// デフォルトコンストラクタ Food(){ foodType = "nothing"; price = 0; }
のように「foodType」メンバに「nothing」を設定し、「price」に「0」を設定をしています。
「引数」が無い場合は、このように「デフォルト」の設定値が適用できるため、おそらく「デフォルトコンストラクタ」と呼ばれているのではないかと思います。
複数作ることができるため、例えば、
#include <iostream> #include <string> using namespace std; //「Food」クラスを定義 class Food { public: string foodType; // 食材の種類 int price; // 食材の価格 // デフォルトコンストラクタ Food(){ foodType = "nothing"; price = 0; } // コンストラクタ Food(string food_type_val, int price_val){ foodType = food_type_val; price = price_val; } //画面表示用メンバ関数 void displayData(){ string str = "type=" + this->foodType + " price=" + std::to_string(this->price); cout << str << endl; } };
のように作成することができます。
コピーコンストラクタ
「コピーコンストラクタ」は「オブジェクト」の代入を行った際に実行される「コンストラクタ」です。
例えば、「main」関数の中で、
int main() { // コンストラクタを利用 Food ft1 = Food(); Food ft2 = ft1; // 「ft2」の値を出力 ft2.displayData(); ft1.foodType = "apple"; ft1.price = 100; ft2.foodType = "orange"; ft2.price = 120; // 標準出力に文字列を出力 ft1.displayData(); ft2.displayData(); return 0; }
のように「ft1」変数の中にあるオブジェクトを代入演算子を利用して「ft2」に代入すると、「参照渡し」では無くて、「オブジェクトの内容のコピー」が行われます。
このプログラムでは、「ft1」のオブジェクトを「ft2」に代入し、それぞれの値を設定後に出力を行っています。
実行結果は・・・
type=nothing price=0 type=apple price=100 type=orange price=120
のようになり、「ft1」と「ft2」のオブジェクトの内容が異なっているのがわかりますね。
この処理の中で自動的に作られて動いているのが「コピーコンストラクタ」で「すべてのメンバのコピー」が裏側で行われているそうです。
いろいろと調べていくと、どうやら「コンパイラ」が「コピーコンストラクタ」を作っているとのことでした。
「C++」言語にはまだまだいろいろな仕組みが用意されているので、引き続きさまざな機能の使い方を学んでいきたいと思います♪
→(次へ)「C++言語」の「カプセル化」とクラスへの「アクセス権限」について学ぼう!!