パハットノート

主にUnity(C#)を中心としたプログラムの備忘録

C++ クラスの利用②(コンストラクタ)





「クラスの利用」シリーズ

1. 宣言、メンバ変数、メンバ関数
2. コンストラクタ(本記事)
3. コンストラクタ
4. メンバ関数のクラス外記述
5. std::coutでの表示




概要

今回はコンストラクタについて紹介します。
ここで作成した2次元ベクトル型クラス「Vector2」を使用していきます。
前回の記事はこちら
kiironomidori.hatenablog.com




コンストラクタのメリット

簡単に言うとクラスの初期化時に呼び出すことができる関数がコンストラクです。
例えば、前回作成した2次元ベクトル型クラスでは宣言と同時に座標を設定するとき、

Vector2 vec;
vec.set(2, 3);

と2行に分けて記述しました。
しかし、コンストラクタを用いれば宣言と同時に任意の処理が行えるので1行で記述することができます




とりあえず使ってみる

説明

コンストラクタは関数の1種であると述べましたが、少し特殊であり戻り値というものが存在しません。そのため、クラス名と同名の関数を宣言したらそれがコンストラクタということになります

具体的にはVector2クラスでは

Vector2(const double& _x, const double& _y) {
    set(_x, _y);
}

の様に記述すると、宣言と同時にdouble型引数を2つ受け取れるようになります。

一方、これを利用するためには変数宣言の時に

Vector2 vec(2, 3);

とする必要があります。


使用例

#include <iostream>

//クラスの宣言
class Vector2 {
public:
    double x, y;

    //コンストラクタ
    Vector2(const double& _x, const double& _y) {
        set(_x, _y);
    }

    //値設定のための関数
    void set(const double& _x, const double& _y) {
        x = _x;
        y = _y;
    }
};

int main() {
    //2次元ベクトル型変数の宣言
    Vector2 vec(2, 3);

    //表示
    std::cout << "(" << vec.x << ", " << vec.y << ")" << std::endl;
}


実行結果

(2, 3)





さらに深めて使用する

説明

先ほどは引数を2つ持つコンストラクタを作成しましたが、実はコンストラクタは複数作成することができます。
特に引数を持たないコンストラクタはデフォルトコンストラクと呼ばれます。
デフォルトコンストラクタは

Vector2 vec1;

とすることで呼び出せます。


使用例

#include <iostream>

//クラスの宣言
class Vector2 {
public:
    double x, y;

    //デフォルトコンストラクタ
    Vector2() {
        std::cout << "デフォルトコンストラクタ" << std::endl;
        x = 0;
        y = 0;
    }

    Vector2(const double& _x, const double& _y) {
        std::cout << "引数が2つのコンストラクタ" << std::endl;
        set(_x, _y);
    }

    //値設定のための関数
    void set(const double& _x, const double& _y) {
        x = _x;
        y = _y;
    }
};

int main() {
    //デフォルトコンストラクタを使用
    Vector2 vec1;

    //表示
    std::cout << "(" << vec1.x << ", " << vec1.y << ")" << std::endl;

    //引数が2つのコンストラクタを使用
    Vector2 vec2(2, 3);

    //表示
    std::cout << "(" << vec2.x << ", " << vec2.y << ")" << std::endl;
}


実行結果

デフォルトコンストラクタ
(0, 0)
引数が2つのコンストラクタ
(2, 3)