
「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++言語」の「コンストラクタ」の仕組みと使い方