「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」の略記とのことで、さらにその右にある「<<」の記号は、右辺にあるものを左辺に出力するという演算子のようです。

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

→「Twitter:@satoru78888」

HOMEへ