constのすすめ

C++を使用してチーム開発を行う場合、自分が作成したクラスや関数を他のメンバーが使用することがあります。このような場合、クラスや関数内部のリソースの保護、関数の呼び出し元のリソースの保護、プログラムの高速化のために変数や関数に対してconst修飾子(以後const)を指定することができます。

クラスのメンバー関数にconstを指定する

クラスのメンバー関数にconstを指定すると、関数内部でクラスで宣言されたメンバー変数の変更ができなくなるため、メンバー関数内部でのメンバー変数の変更を防止することができます。

int* GetArray() const 
{
      return m_array;
}


配列の要素を変更不可にする

ArrayクラスのアクセサであるGetArray関数の戻り値の型の先頭にconstを指定すると、配列の要素を変更不可にすることができます。次のArrayクラスの配列の要素を外部から変更できると思わぬバグが発生することがあります。戻り値の型の前にconstを指定することにより、配列の要素の変更が行われる心配はなくなります。

const int* GetArray()
{
      return m_array;
}

class Array
{
public:
    static const int MAX = 10;

    // 配列の要素を変更不可にする
    const int* GetArray()
    {
        return m_array;
    }

    // コンストラクタ
    Array()
     :
     m_array(new int[MAX])
    {
        std::fill(m_array, m_array + MAX, 1);
    }
    // デストラクタ
    ~Array()
    {
        delete [] m_array;
    }

private:
    int* m_array;
};


配列へのポインタを変更不可にする

ArrayクラスのアクセサであるGetArray関数の直前にconstを指定すると、Arrayクラスの配列へのポインタ自体を変更不可にすることができます。Arrayクラスの配列へのポインタを誤ってインクリメントやデクリメントができると、思わぬエラーが発生することがあります。GetArray関数の直前にconstを指定することでポインタ自体を変更することができなくなり、ポインタの安全性が増します。

int* const GetArray()
{
      return m_array;
}

class Array
{
public:
    static const int MAX = 10;

    // 呼び出し先で配列のポインタを変更不可にする
    int* const GetArray()
    {
        return m_array;
    }

    // コンストラクタ
    Array()
     :
     m_array(new int[MAX])
    {
        std::fill(m_array, m_array + MAX, 1);
    }
    // デストラクタ
    ~Array()
    {
        delete [] m_array;
    }

private:
    int* m_array;
};


引数にconst参照を指定する

関数を呼び出すときの引数にconst参照を指定すると、「関数に渡される引数のコピーが発生しないため高速に関数呼び出し」を行うことができます。次のUpdate関数にMatrix型の変数を渡す際に、const 参照を指定しない場合、4×4個のfloat型の変数をスタックにコピーすることになり、関数の呼び出しに負荷が掛かります。
更に、Update関数の呼び出しを行う際に「呼び出し元のMatrix型の変数の内容を呼び出し先で変更することができなくなる」ため、堅牢な関数呼び出しを実現することができます。

void Update(const Matrix& rotation, const Matrix& translation)
{
    Matrix position = rotation * translation;
}


この記事が気に入ったらサポートをしてみませんか?