C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のmutable指定子とは?constオブジェクトでもメンバーを変更できる仕組み

C++のmutableストレージクラス指定子とは

mutableストレージクラス指定子は、クラスのデータメンバーにのみ使用できる修飾子です。この指定子を付けたメンバーは、そのメンバーが含まれるオブジェクトがconstとして宣言されていても、値を変更することができます。

ただし、mutableは以下のような名前に対しては使用できない点に注意が必要です。

  • staticとして宣言されたメンバー
  • constとして宣言されたメンバー
  • 参照型のメンバー

コード例

次のサンプルコードを見てみましょう。

class A
{
    public:
    A() : x(4), y(5) { };
    mutable int x;
    int y;
};

int main()
{
    const A var2;
    var2.x = 345;
    // var2.y = 2345;
}

動作の解説

この例では、var2はconstとして宣言されているため、コンパイラは「var2.y = 2345;」という代入を許可しません。

一方、「var2.x = 345;」という代入は問題なくコンパイルできます。これは、クラスAのメンバー変数xmutableとして宣言されているためです。つまり、オブジェクト全体がconstであっても、mutable指定されたメンバーだけは書き換えが許されます。

mutableの実用的な活用シーン

mutableは、「外部から見た振る舞いとしてはconstでありながら、内部の補助的な状態だけを更新したい」という場面で特に役立ちます。代表的な活用例は以下の通りです。

  • キャッシュ処理: 計算結果を初回アクセス時に保存し、以降の同じ呼び出しでは保存済みの結果を再利用する
  • ミューテックスによる排他制御: constメンバー関数内でも、スレッド安全のためのミューテックスをロック・アンロックする
  • 遅延初期化: リソースが必要になった時点で初めて生成・初期化する

このようにmutableを適切に使うことで、constの安全性を保ちながら柔軟な設計を実現できます。

  1. C++で解く「迷路 II」問題 ― 壁に当たるまで転がるボールの最短距離をBFSで求める

    問題概要 空きマスと壁からなる迷路の中にボールがあります。ボールは上・下・左・右のいずれかの方向に転がって空きマスを進むことができますが、壁にぶつかるまで止まることはできません。ボールが停止したときに、初めて次の方向を選ぶことができます。 ボールのスタート位置、目的地、そして迷路そのものが与えられるので、ボールが目的地で停止するまでの最短距離を求めてください。ここでの距離とは、ボールが転がって通過した空きマスの数のことです(スタート位置は含まず、目的地は含みます)。どうしても目的地で停止できない場合は -1 を返します。 迷路は2次元配列で表現されます。1 が壁、0 が空きスペースを意味し、迷

  2. C++で解く迷路問題:転がるボールが目的地に止まれるかをBFSで判定する方法

    迷路の中にボールがあるとします。迷路には空きスペース(通路)と壁があります。ボールは上下左右のいずれかの方向に転がって空き通路を進むことができますが、壁にぶつかるまで止まりません。ボールが停止したときに、次の方向を選べます。この問題では、ボールの開始位置、目的地、そして迷路そのものが与えられ、「ボールが目的地の位置で停止できるかどうか」を判定する必要があります。迷路は2次元配列で表現され、1は壁、0は空きスペースを意味します。迷路の外周はすべて壁になっています。開始位置と目的地は行・列のインデックス(座標)で与えられます。問題例たとえば、次のような2次元配列で表される迷路を考えてみましょう。0