1

私は C++ を勉強していて、次のことを読みました:データ メンバーが変更可能であると宣言されている場合、const メンバー関数からこのデータ メンバーに値を代入することは合法です。 しかし、次のコードは、gcc によるエラーや警告なしでコンパイルされました。(これは実際のコード例ではありません。mutable キーワードをテストするために書いただけです)

class M
{
public:
  M(){x=10;};
  int getX() {x++; return x;};
private:
  mutable int x;
};

int main()
{
  M xx;
  std::cout << xx.getX() << std::endl;
}

getX を const として宣言するべきではありませんか?

編集 1 (ForEver の回答は物事をより明確にします)、次のコードはコンパイルされません

class M
{
public:
  M(){x=10;};
  int getX() const {x++; return x;};
private:
  int x;
};

int main()
{
  M xx;
  std::cout << xx.getX() << std::endl;
}
4

3 に答える 3

3

関数内のミュータブルを変更することは合法でconstあり、もちろん関数内のミュータブルを変更することも合法non-constです (それぞれのようにnon-const member-variable)。mutableキーワードは、関数内の変数の変更を許可しますが、const関数内の変更に制限を与えませんnon-const

于 2013-04-25T05:01:52.660 に答える
0

発言はこういう意味です。

class M
{
public:
   M(){x=10;};
   int getX() const
 //           ^^^^^ If a member function is const...

                   {x++; return x;};
 //                 ^^^ ...and it modifies a member variable...
private:
   mutable int x;
// ^^^^^^^ ...then that variable must be mutable.
};
于 2013-04-25T05:28:50.920 に答える
0

mutable通常、const修飾されたメンバー関数がキャッシュされたデータを変更できるようにするために使用されます。as を宣言getX()const、喜んで変更することができますx。それが mutable の目的です。ただし、メンバー関数内のオブジェクトの内部状態を変更することは、一般に悪い考えであると考えられていますが、その宣言ではそうではありません。

たとえば、コンテナーの内容に基づいて値を計算する const メンバー関数があるとします。コンテナーに多くの要素がある場合、結果を取得するのに時間がかかる場合があります。コンテナーに要素を追加または削除したときにのみ結果が変わる場合は、後で使用するためにキャッシュできます。メンバー関数は const 修飾されているため、結果変数を として宣言する必要がありますmutable。結果はコンテナー内の既存のデータから計算できるため、キャッシュされた値はオブジェクトの内部状態の一部とは見なされず、const 関数により変更しても問題ないと見なされます。

int Foo::CalcResult() const
{
    if(hasValidCache_ == false)
    {

        // ... recalc value ...

        // Cache the result
        hasValidCache = true;
        cachedValue_ result;
    }

    return cachedValue_;
}
于 2013-04-25T05:22:32.387 に答える