2011-12-28 168 views
2

當函數將參數作爲reference指定爲const object時,我知道作爲參數傳遞給它的對象不能使用reference進行修改?那麼在C++中有沒有任何場景可以通過引用來修改const object?如果是,請舉例說明。使用參考修改常量對象

回答

4

C++有一個叫mutable特徵,其中一個數據成員甚至可以通過const引用改變

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 
} 

我得到以下錯誤:

 
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;成功。

此功能通常僅用於private成員變量,其中數據成員的更改不會影響對象的外部可見常量。例如,它可以用作優化來提供緩存先前計算的值的方法。

+0

謝謝。你能解釋更多關於'這個功能通常只用於私人成員變量嗎? – 2011-12-29 05:28:20

+0

真正的說。如果你有一個像上面例子那樣的'public mutable'成員變量,那麼'const'並不意味着任何有用的東西,因爲對象的公共部分甚至可以通過'const'引用而明顯改變。另一方面,如果一個'private mutable'成員變量只做內部緩存之前的計算結果,那麼該對象的* public *部分不會明顯地改變行爲。 – 2011-12-29 05:54:08

1

您總是可以使用const_cast丟棄const-度;這可能會導致未定義的行爲,如果你不小心。

我猜你也可以圖謀是這樣的:

class Foo 
{ 
private: 
    mutable int x; 

public: 
    void bar() const { x++; } 
}; 

void func(const Foo &foo) 
{ 
    foo.bar(); 
    // foo is now modified! 
} 
+0

具體的問題是*在C++中是否有任何場景可以通過引用來修改const對象?*。從技術上講,如果對象*是* const,則拋出常量並使用它來修改它將是未定義行爲*總是* – 2011-12-28 23:37:56