2011-12-28 17 views
2

関数がreferenceからconst objectにパラメータを受け取るとき、引数として渡されたオブジェクトはreferenceを使用して変更できないことを理解していますか?では、C++にはconst objectのリファレンスを使って変更できるシナリオがありますか?はいの場合は、例を示します。参照を使用したconstオブジェクトの変更

答えて

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;は成功します。

この機能は、通常、メンバー変数のみの場合にのみ使用されます。データメンバの変更は、オブジェクトの外部からの可視性に影響しません。たとえば、以前に計算された値をキャッシュする方法を提供する最適化として使用できます。

+0

ありがとう。 'この機能は通常プライベートメンバ変数にのみ使用されます' –

+0

本当に言うとおりです。上記の例のように 'public mutable'メンバ変数がある場合、' const'は実際には何も意味しません。なぜなら、オブジェクトのパブリック部分は 'const'参照によっても目に見える形で変わる可能性があるからです。一方、 'private mutable'メンバ変数が以前に計算された結果をキャッシュのように内部的にしか処理しない場合、オブジェクトの* public *部分は動作を視覚的に変更しません。 –

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 * –

関連する問題