「C++言語」で「オブジェクト指向」を学ぼう!!
今回から「C++言語」と「オブジェクト指向」の学習を進めていきたいと思います。
これまでに学んできた「C言語」のさらに進化した言語とのことで、不安な部分もたくさんあるのですが、いろいろと調べながら「C++言語」を習得していきたい。
本当の目的は「C++言語」を学んで「ゲームを作りたい!!」という「隠れ願望」があったりします。
どんどん学ぶ内容が高度になっていくので、日々学習のハードルも上がっていきます・・・
「オブジェクト指向」って何?
知り合いのプログラマさんから「プログラミング初学者はほとんどここでつまづくから」と言われて、内心ビクビクしながら学んでいるのですが、どんな考え方なのかを見ていきたいと思います。
いろいろと調べていく中で、「クラス」と「オブジェクト」の関係性が非常に重要で、「Javascript」で「シューティングゲーム」作りにチャレンジした時も、そういえば「オブジェクト」が出てきました。
あらためて整理してみると、
のようなイメージで、まず「クラス(オブジェクトのひな型・設計図)」を作って、そのクラスを元に「オブジェクト」を作るというイメージになります。
「クラス」の作り方と利用例
クラスを作るためには、
class クラス名 { public: 公開するメンバ private: 公開しないメンバ };
のように書いていく必要があります。
例えば、「家具(Furniture)」を元にクラスを作成してみると、
class Furniture { public: string type; // 家具の種類 int price; // 家具の価格 };
のようになります。
他にも、家具の「重量・色・デザイン」等など、さまざま家具に関するデータを定義することができます。
「クラス」に属する「データ・操作」のことを「C++言語」では「メンバ」と呼んでいます。
「Furniture」クラスを利用したプログラムを作ってみると、
#include <iostream> #include <string> using namespace std; //「Furniture」クラスを定義 class Furniture { public: string type; // 家具の種類 int price; // 家具の価格 }; int main() { // 「Furniture」クラス型の変数に「Furniture」クラスのオブジェクトを作成し格納する Furniture ft1 ; //「type」メンバに「chair」を設定 ft1.type = "chair"; //「price」メンバに家具の価格を設定 ft1.price = 5800; // 画面に表示する文字列を作成 string display = "type=" + ft1.type + " price=" + std::to_string(ft1.price); // 標準出力に文字列を出力 cout << display << endl; return 0; }
になります。・・・が、見慣れない書き方がたくさんあります。
まず、
画面に文字列を出力する場合は、
cout << 表示する文字列 << endl;
のように書きますが、一番左にある「cout」は、「character output」の略記とのことで、さらにその右にある「 <<」の記号は、右辺にあるものを左辺に出力するという演算子のようです。< /p>
「endl」は、「改行する」という意味があるそう。
C言語だと「printf」関数で文字列などを出力していたので、「C++言語」独特の書き方になっていますね。
クラスのオブジェクト内のデータを利用するためには、
オブジェクトを格納している変数.メンバ
のように書いていきます。
ここまでを見ると、「C言語」の「構造体」と似たような機能という印象です。
「操作」を定義するメンバ
「クラス」の中に操作を定義する「メンバ」を持つことができます。
クラスの中に「関数」を持つことができ、クラスの中の関数を使うことができるというイメージです。
例えば、
#include <iostream> #include <string> using namespace std; //「Furniture」クラスを定義 class Furniture { public: string type; // 家具の種類 int price; // 家具の価格 // 家具の情報を画面に出力する関数 void displayData(string data){ cout << data << endl; } }; int main() { // 「Furniture」クラス型の変数に「Furniture」クラスのオブジェクトを作成し格納する Furniture ft1 ; //「type」メンバに「chair」を設定 ft1.type = "chair"; //「price」メンバに家具の価格を設定 ft1.price = 5800; // 画面に表示する文字列を作成 string displayStr = "type=" + ft1.type + " price=" + std::to_string(ft1.price); // 標準出力に文字列を出力 ft1.displayData(displayStr); return 0; }
「Furniture」クラスの中に「displayData」メンバを作っていますが、このメンバは関数となっています。
「displayData」関数では、引数に受け取った文字列を画面に出力する処理を行っています。
「this」の使い方
「this」というキーワードを使うと、クラス内の関数から「関数が所属しているクラスのオブジェクトのポインタ」を取得することができます。
「ポインタ」なので、そのオブジェクトのメンバにアクセスする場合は、
#include <iostream> #include <string> using namespace std; //「Furniture」クラスを定義 class Furniture { public: string type; // 家具の種類 int price; // 家具の価格 void displayData(){ string str = "type=" + this->type + " price=" + std::to_string(this->price); cout << str << endl; } }; int main() { // 「Furniture」クラス型の変数に「Furniture」クラスのオブジェクトを作成し格納する Furniture ft1 ; //「type」メンバに「chair」を設定 ft1.type = "chair"; //「price」メンバに家具の価格を設定 ft1.price = 5800; // 標準出力に文字列を出力 ft1.displayData(); return 0; }
この方が作り方としてはシンプルな気がする。
「C言語」より思った以上に難解なのですが、「C言語」で学んだ知識が活かせたときは嬉しいですね♪
いろいろと躓きそうですが、どんどん学習を続けていきたいと思います。
途中で「挫ける」かもしれないけれど・・・
→(前へ)「関数ポインタ・キャスト・コマンドライン引数」を学んでみる
→(次へ)「C++言語」の「コンストラクタ」の仕組みと使い方