mutable
キーワードは、オブジェクトの上にドレープするベールを突き刺す方法ですconst
。オブジェクトへの const 参照またはポインターがある場合、いつ、どのようにマークされているかを除いて、そのオブジェクトを変更することはできませんmutable
。
const
参照またはポインターを使用すると、次のことが制限されます。
- 可視データ メンバーの読み取りアクセスのみ
- としてマークされたメソッドのみを呼び出す権限
const
。
例外により、mutable
マークされたデータ メンバーを書き込みまたは設定できるようになりましたmutable
。それは、外から見える唯一の違いです。
内部const
的には、可視のメソッドは、 とマークされたデータ メンバーにも書き込むことができますmutable
。本質的にコンストベールは包括的に貫かれています。mutable
が概念を破壊せずconst
、有用な特別な場合にのみ使用されることを保証するのは、完全に API 設計者次第です。キーワードは、mutable
これらの特殊なケースの対象となるデータ メンバーを明確にマークするので役立ちます。
実際にはconst
、コードベース全体で執拗に使用できます (基本的に、コードベースにconst
「病気」を「感染させたい」)。この世界では、ポインターと参照にはconst
ほとんど例外がなく、推論と理解が容易なコードが生成されます。興味深い余談については、「参照透過性」を調べてください。
mutable
キーワードがないと、最終的にconst_cast
は、それが許すさまざまな便利な特殊なケース (キャッシング、参照カウント、デバッグ データなど) を処理するために使用せざるを得なくなります。残念ながら、使用しているオブジェクトの保護を APIクライアントに強制的に破棄させるconst_cast
よりも、はるかに破壊的です。さらに、広範な破壊を引き起こします。 const ポインターまたは参照を使用すると、可視メンバーへの自由な書き込みおよびメソッド呼び出しアクセスが可能になります。対照的に、API 設計者は例外をきめ細かく制御する必要があり、通常、これらの例外はプライベート データを操作するメソッドに隠されています。mutable
const
const
const_cast
mutable
const
const
(注意: データとメソッドの可視性について何度か言及しています。ここで説明するオブジェクト保護のまったく異なるタイプである public と private または protected としてマークされたメンバーについて話しているのです。)