ひらめの日常

日常のメモをつらつらと

C++のクラス関連で調べたことメモ

アクセス修飾子

まずは書き方.順番やその個数は任意で,何度現れても良い.

class Hoge {
public:
    int a;
private:
    int b;
public:
    int c;
};

デフォルトのメンバは private として扱われる.

コンストラク

コンストラクタは,クラスオブジェクトが生成されるときに呼び出される.(値を返さないので自分の実感としてはコンストラクタというよりイニシャライザの方がしっくりくる.)もし明示的にコンストラクタが定義されていない場合,引数を受け取らないコンストラクタが自動的に定義される.

class Hoge {
private:
    int a;
public:
    Hoge(int x) {
        a = x;
    }
    void fuga() {
        a++;
    }
};

引数が1つの場合

引数が一つのコンストラクタは,変換コンストラクタと呼び,明示的呼び出しと暗黙的呼び出しの二つの呼び出し方がある. つまり,上記の Hogeクラス の場合,以下の二通りの呼び出しが同義になっている.

Hoge h = 10;
Hoge h = Hoge(10);

暗黙的呼び出しを禁止したいときには,explicit とコンストラクタに宣言しておくことで,明示的呼び出しのみが呼び出される.

参考 引数1個のコンストラクタの暗黙呼び出しとexplicit

移譲コンストラク

delegating constructors. 例えば,引数ありで生成した時はその引数でメンバを初期化し,引数なしで初期化した時はデフォルト値で初期化したいという時がある.この時は,次のように移譲コンストラクタを書けば良い.

class Hoge {
private:
    int a;
    const int DEFAULT_VALUE = 0;
public:
    Hoge(int x) {
        a = x;
    }
    Hoge: Hoge(DEFAULT_VALUE) {}
    void fuga() {
        a++;
    }
};

参考 移譲コンストラクタ - cpprefjp C++日本語リファレンス

ヘッダとソースを分離する

宣言とその定義を別ファイルに分けて可読性を高めようということ. ヘッダファイルはクラス定義などを書き,ソースファイルにはメンバ関数の定義などを書く.

他のファイルで使用する時は,宣言が書いてあるヘッダファイルをincludeすれば良い.

Hoge.h

class Hoge {
private:
    int a;
    const int DEFAULT_VALUE = 100;
public:
    Hoge(int x);
    Hoge: Hoge(DEFAULT_VALUE);

    void fuga();
};

Hoge.cpp

#include "Hoge.h"

Hoge:: Hoge(int x) {
    a = x;
}
Hoge:: Hoge: Hoge(DEFAULT_VALUE) {}

void fuga() {
    a++;
}

参考