関数が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参照を使用したVariadicテンプレートの特殊化
- 3. ポインタへのconst参照はオブジェクトを変更することができます
- 4. const参照を使用して一時オブジェクトの寿命を延ばす
- 5. 戻りconst参照と一時オブジェクト
- 6. 参照ツーのconst
- 7. const std :: stringリファレンスの参照先を変更する
- 8. (const)参照へのポインタの変換
- 9. const参照変数の初期化
- 10. jsオブジェクトの置換/参照の変更
- 11. Javaでのオブジェクト参照の変更
- 12. 関数にパラメーターとして渡された参照constオブジェクトの使い方
- 13. 非constにキャストした後のconst参照の動作
- 14. RWCString - 値渡しまたはconst参照
- 15. オブジェクトの参照と変更可能性
- 16. 割り込みによるconst参照の変更
- 17. 関数の変更constオブジェクト
- 18. 元の参照変数を変更した後にJavaオブジェクトを再度参照する方法
- 19. コンストラクタでconstへの参照を使用したいのはなぜですか?
- 20. const参照を返す
- 21. getterメソッドのconst参照
- 22. constベクトル参照のオーバーロード
- 23. 構築ローカルオブジェクト - constの参照
- 24. C++のオーバーライド+ = const参照と
- 25. 比較関数でconst参照VS非const参照対値渡し
- 26. 変数を使用してオブジェクトを参照する(C#)
- 27. 非constを使用したconstオブジェクトの作成
- 28. RMIを使用したオブジェクト参照の受け渡し
- 29. 変数をオブジェクト参照として使用する
- 30. Delphiのconstへの参照渡し
ありがとう。 'この機能は通常プライベートメンバ変数にのみ使用されます' –
本当に言うとおりです。上記の例のように 'public mutable'メンバ変数がある場合、' const'は実際には何も意味しません。なぜなら、オブジェクトのパブリック部分は 'const'参照によっても目に見える形で変わる可能性があるからです。一方、 'private mutable'メンバ変数が以前に計算された結果をキャッシュのように内部的にしか処理しない場合、オブジェクトの* public *部分は動作を視覚的に変更しません。 –