関数がreference
からconst object
にパラメータを受け取るとき、引数として渡されたオブジェクトはreference
を使用して変更できないことを理解していますか?では、C++にはconst object
のリファレンスを使って変更できるシナリオがありますか?はいの場合は、例を示します。参照を使用したconstオブジェクトの変更
2
A
答えて
4
C++は、データメンバもconst参照てを変更することがありmutable
と呼ばれる機能があります。
class Foo {
public:
int a;
mutable int b;
};
int main() {
Foo f;
f.a = 1; // ok
f.b = 2; // ok
const Foo &g = f;
g.a = 1; // compile error
g.b = 2; // ok
}
Iを次のエラーが表示されます。
In function 'int main()': Line 12: error: assignment of data-member 'Foo::a' in read-only structure compilation terminated due to -Wfatal-errors.
ただし、割り当てg.b = 2;
は成功します。
この機能は、通常、メンバー変数のみの場合にのみ使用されます。データメンバの変更は、オブジェクトの外部からの可視性に影響しません。たとえば、以前に計算された値をキャッシュする方法を提供する最適化として使用できます。
1
const
は、const_cast
を使用していつでもキャストできます。これは慎重ではない場合、未定義の動作につながる可能性があります。
は、私はあなたにもこのような何かを工夫ことができると思います:
class Foo
{
private:
mutable int x;
public:
void bar() const { x++; }
};
void func(const Foo &foo)
{
foo.bar();
// foo is now modified!
}
+0
具体的な質問は、constオブジェクトを参照することでconstオブジェクトを変更できるC++のシナリオはありますか?技術的には、オブジェクト*がconstであれば、constを捨てて、それを使って修正します。Undefined Behavior * always * –
関連する問題
- 1. 非constオブジェクトへのconst参照
- 2. 戻りconst参照と一時オブジェクト
- 3. 参照ツーのconst
- 4. const std :: stringリファレンスの参照先を変更する
- 5. RWCString - 値渡しまたはconst参照
- 6. 関数の変更constオブジェクト
- 7. const参照を返す
- 8. getterメソッドのconst参照
- 9. RMIを使用したオブジェクト参照の受け渡し
- 10. Checkbox/radiobuttonsのEditorTemplateを使用したオブジェクト参照エラーの発生
- 11. constポインタ参照を返します
- 12. std :: remove_constとconst参照
- 13. クラスのオブジェクトへのconst参照の格納
- 14. Entity Frameworkのオブジェクト参照の使用
- 15. C++変換constが参照渡しテンプレートを考える
- 16. アソシエーション:IDまたはオブジェクト参照を使用しますか?
- 17. Hamlオブジェクト参照の使用。 %DIV [@user]
- 18. 更新オブジェクトが更新されたオブジェクトへのすべての参照(リファレンスを参照)
- 19. 参照変数を使用した静的メソッド呼び出し
- 20. 即時にオブジェクトの参照内容を変更する
- 21. const以外のオブジェクトをconst参照から初期化するときのコピーを防止します
- 22. のconst参照資格のメンバ関数
- 23. マイクロデータを使用したプロジェクト参照
- 24. カスタムイベントを使用したAS3参照エラー
- 25. gcc 4.9.1 constの自動参照へのC++ローカル変数のバインド
- 26. セマンティクスとconst参照を移動する
- 27. 非constの左辺値参照
- 28. 関数ポインタへのconst参照
- 29. 古い参照フィールド対動的フィールドのconst constの行動
- 30. GCの後にオブジェクト参照が変更される
ありがとう。 'この機能は通常プライベートメンバ変数にのみ使用されます' –
本当に言うとおりです。上記の例のように 'public mutable'メンバ変数がある場合、' const'は実際には何も意味しません。なぜなら、オブジェクトのパブリック部分は 'const'参照によっても目に見える形で変わる可能性があるからです。一方、 'private mutable'メンバ変数が以前に計算された結果をキャッシュのように内部的にしか処理しない場合、オブジェクトの* public *部分は動作を視覚的に変更しません。 –