なに可変'キーワードは、その目的以外の変数を変更できるようになって、const機能しているのでしょうか。

StackOverflow https://stackoverflow.com/questions/105014

  •  01-07-2019
  •  | 
  •  

質問

以前からあった一部のコードを会員が変数のクラスの mutable キーワードとなります。などなど、これは構文なのでしょうか単にできる変数に const 方法:

class Foo  
{  
private:  
    mutable bool done_;  
public:  
    void doSomething() const { ...; done_ = true; }  
};

これを使わずにこのキーワードまたははいいという以上を満たすのです。私はこの技術は、クラス、ポリマー boost::mutex としての可変が可能 const 機能をロックでスレッドの安全上の理由からですが、正直なところ、このビットのhack.

役に立ちましたか?

解決

また、分化のビット単位の定数の論理的なconst.論理定数は、オブジェクトな変化が表示され、公開インタフェースを好のロックの一例です。もうクラスを計算する値の最初の時間をお願いする際は、あらかじめ、キャッシュに書き込みます。

以来、c++11 mutable で使用することができますラムダを表示するもので撮影の値を変更可能(いないのでデフォルト):

int x = 0;
auto f1 = [=]() mutable {x = 42;};  // OK
auto f2 = [=]()         {x = 42;};  // Error: a by-value capture cannot be modified in a non-mutable lambda

他のヒント

mutable キーワードは破し、 const ヴェールまdrape過ごす。とした場合定数の参照ポインタをオブジェクトにバインドし、変更できませんそのオブジェクトの他の方 を除く 何時どのようにすることができるものとし mutable.

const 参照またはポインタで制約される:

  • のみを読み込みアクセスのための他の可視のデータメンバー
  • 許可を呼び出する方法としているときは、 const.

mutable 例外とすることができるようになった書または設定データメンバーについて mutable.することになりそう外部から見えます。

内部者 const 方法の視界に入ることもでき書き込みデータメンバーについて mutable.基本的にはconstヴェールは自分たちの突き刺したが総合的にでは、完全にAPIのデザイナーを mutable 壊れない const コンセプトやス利用の有用な特殊な場合に解いた。の mutable キーワードですので明確にマークデータメンバーがこれらの特殊な場合に解いた。

実際に利用できる const 表現を通してコードベース(基本的にいたい"感染"ドの const "病").この世の中にポインタと参照 const 非常に少数の例外を除き、コードの降伏りやすい理由とする。のための興味深い余談で見"参考透明性".

なし mutable キーワードにまずれの使用を強制され const_cast のさまざまな工夫をこらして特別な場合が可能(キャッシュ、参考計数、デバッグのデータます。残念ながら const_cast により破壊 mutable ですので、API お客様 の破壊に const 保護のオブジェクト(s)た。また、原因が広が const 破壊 const_castグconstポインタを参照できる自由な書き方法を呼び出しアクセスを目に見える。一方 mutable しを要求するAPIのデザイナーへの行使の微細制御 const 例外は、通常これらの例外に隠されている const 方法に営業個人データです。

(N.B.私はをご参照データと方法 視認性 きました。いの会員としてマーク公共前プライベートあるいは保護されたのは全く異なる型のオブジェクトを保つ こちらの.)

ご利用ブー::ミューテックスはどこのキーワードはありません。他の利用のための内部結キャッシュを高速にアクセス。

基本的には、'可変'が適用されるクラス属性には影響しませんの外可視状態のオブジェクトです。

のサンプルコード、可変が不適切な場合の値done_に影響する外部の状態によって違いますので、それぞれの...;ます。

可変するマーキング特定の属性として変更可能から const ます。ただけます。くで使いたい時に、コードそのクリーンで読みやすくするために変更された場合のデザインを利用するのではなく、 mutable.

http://www.highprogrammer.com/alan/rants/mutable.html

い場合には、狂人など 変更可能なのは、何ですか。こちらの の微妙な場合:可変の 場合にはオブジェクトが論理的に 定したが、実際のニーズに 変化します。これらの例の少ない の間にも存在します。

例文のを含むキャッシュおよび臨時のデバッグの変数.

で応が隠れていた内部状態になります。例えば:

class HashTable
{
...
public:
    string lookup(string key) const
    {
        if(key == lastKey)
            return lastValue;

        string value = lookupInternal(key);

        lastKey = key;
        lastValue = value;

        return value;
    }

private:
    mutable string lastKey, lastValue;
};

そのときに const HashTable オブジェクトは今もその lookup() 法、変数を変更する機能を提供する内します。

もええ、そうそうなんです。に用いる変更の方法によりしない 論理的に 変更の状態クラスタを高速にルックアップを実装することによりキャッシュ:

class CIniWrapper
{
public:
   CIniWrapper(LPCTSTR szIniFile);

   // non-const: logically modifies the state of the object
   void SetValue(LPCTSTR szName, LPCTSTR szValue);

   // const: does not logically change the object
   LPCTSTR GetValue(LPCTSTR szName, LPCTSTR szDefaultValue) const;

   // ...

private:
   // cache, avoids going to disk when a named value is retrieved multiple times
   // does not logically change the public interface, so declared mutable
   // so that it can be used by the const GetValue() method
   mutable std::map<string, string> m_mapNameToValue;
};

現在、使用することでケア並行処理で問題が大きな懸念として、呼び出し側がつながると考えているスレッドに対して安全だけを使用 const ます。もちろん、改変 mutable データな変化の挙動をオブジェクトの重要なファッションできるように違反することとなる例にとった場合、インスタンスが期待されることとなった変動ディスクに書き込まればすぐに見えるアプリです。

mutable 存在すると推測をすることによりデータの修正、その他一定の機能です。

を意図している機能"何もしない"の内部状態のオブジェクトで、マークの機能 const, だが本当に必要な変更一部のオブジェクトの状態とな影響を与える正しい可能です。

キーワードとして機能しているとのヒントをコンパイラー--理論のコンパイラが所定数オブジェクトなどのグローバル)メモリとした読み取り専用になります。の存在 mutable ヒントすることは避けなければならない。

ここでは理由を宣言するのに使用変更可能なデータ:

  • スレッドの安全性です。宣言 mutable boost::mutex 完全にリーズナブル。
  • 統計学です。のセキュリティ確保のための通話機能、一部またはすべて引数になります。
  • Memoization.計算一部の高額な答えを保存することは、今後の参考のためではなくrecomputingルを設定することができます。

可変する際に使用して変数のクラスでだけ使用するクラス信号のような、例えば、ミューテックスまたはロックが解除されます。この変数が変わることはありませんの行動のクラスが必要に実施するためにスレッドの安全性はクラス自体です。このようにばな"可変"は必要ありませんことのできない"const"機能でこの変数を変更する必要があるすべての機能をご利用いただけるのです。そのため、変更可能なたに導入するためにはメンバ変数が書き込み可能なものconstます。

を変更可能な指定した通知のコンパイラのリーダーで 安全で期待されるという変数を変更内にconst 会員機能です。

可変が主に使用される実装のクラスです。ユーザのクラスは必要ありませんについて知り、そのためのメソッドのだが、"べき"する定数です。自例のミューテックスする可変良い標準的な例です。

ご利用になるhackもののように多くのことC++では、可変 ができ するとハッキングのためのぐさプログラマとして捉えられるべきだと思いくには、マークうべきでない定数としての非const.

"に変更可能な"きなものについて論理的に無国籍のユーザーとして"const"setterかのクラスのApiがない状態なの基本となる実装のコードおります。cpp).

の場合に使っても頻度の高い流を初期化の状態を以下の"白旧データ"。すなわち、理想の狭い場合員もいずれかの構築(プロセッサ)または持ち運びメモリは、多くのユーザーのオブジェクトについて聞くことはありません。こうしたもとにしたいものぐ工事の末ファイアーパフォーマンスの経験から90%のオブジェクト内蔵のない建てしていくのか、いまだに存在し、正しい状態なAPIを公開。

変更可能なの変化の意味 const からビット単位の定数の論理定数のクラスです。

このクラス変更可能な会員長するビット単位で定数のとなりに読み取り部分の実行形式にまとめたものです。

また変更の型チェックを const 会員機能が変更可変バを使用せずに const_cast.

class Logical {
    mutable int var;

public:
    Logical(): var(0) {}
    void set(int x) const { var = x; }
};

class Bitwise {
    int var;

public:
    Bitwise(): var(0) {}
    void set(int x) const {
        const_cast<Bitwise*>(this)->var = x;
    }
};

const Logical logical; // Not put in read-only.
const Bitwise bitwise; // Likely put in read-only.

int main(void)
{
    logical.set(5); // Well defined.
    bitwise.set(5); // Undefined.
}

のその他の回答を詳細につかめなけタイプsafteyと影響を与え、コンパイルされた結果です。

場合などには十設計の反復子のクラスのニーズを保持カウントまたはその他の付随的な価値がないのに影響する主要な"状態"のクラスです。この内で最もよく使われているか変更可能な使用します。なしに変更可能なまえに犠牲を強いられ、全体のconstらしさの設計されるようお願いします。

このhackほとんどの時間を私にしています。有用なも非常に少数です。

クラシックの例として述べたその他の回答にのみ状況を見る mutable キーワードの使用これまでのキャッシュの結果、複雑な Get 法、キャッシュが実施してデータのクラスとしてではなく静的変数の方法を理由とし複数の機能または清浄度).

一般的には、代替案の mutable キーワードは通常は静的変数の方法または const_cast リックを達成しています。

別の詳細な説明が こちらの.

を可変できる手軽なき挑const仮想機能およびす子どもクラスメンバー変数による機能です。ほとんどの場合にだいたいインタフェースを変える基底クラスで使用変更可能なメンバー変数。

を変更可能なキーワードは非常に有の作成時にスタブクラスの試験の目的できるスタブは、定数の数も増やすことができたので(可変)カウンターなどの試験機能を追加するだスタブ.このインタフェースstubbedクラスはそのままにします。

一例として使用変更可能なのは、深いコピーします。にコピーコンストラクタでお送りしま const &obj としての引数。では、新しいオブジェクトを作成する一定のタイプです。していくために、どのような変更(主にして変わらないと思いますが、珍しが変更される場合があります)の会員にこの新規作成された定数のオブジェクト申告が必要になりますので mutable.

mutable スストレージクラスにのみ使用でき非static非constデータのクラスです。可変データのクラスに変更が可能であっても、一部のオブジェクトであるとして宣言されたconst.

class Test
{
public:
    Test(): x(1), y(1) {};
    mutable int x;
    int y;
};

int main()
{
    const Test object;
    object.x = 123;
    //object.y = 123;
    /* 
    * The above line if uncommented, will create compilation error.
    */   

    cout<< "X:"<< object.x << ", Y:" << object.y;
    return 0;
}

Output:-
X:123, Y:1

上記の例では、この値を変更するには、会員が変 x このオブジェクトであるとして宣言されたconst.この変数 x として宣言された可変です。だ改造してみてはいかがでしょうかは、価値の変動 y, 、コンパイラというエラーとなります。

のキーワード'可変'では実際に予約がキーワードとなります。しばしば使用されなりの価値の定数を可変となります。たいてい複数の値のconstsntのキーワード可変です。

//Prototype 
class tag_name{
                :
                :
                mutable var_name;
                :
                :
               };   
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top