なに可変'キーワードは、その目的以外の変数を変更できるようになって、const機能しているのでしょうか。
質問
以前からあった一部のコードを会員が変数のクラスの 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;
:
:
};