當函數將參數作爲reference
指定爲const object
時,我知道作爲參數傳遞給它的對象不能使用reference
進行修改?那麼在C++中有沒有任何場景可以通過引用來修改const object
?如果是,請舉例說明。使用參考修改常量對象
2
A
回答
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
成員變量,其中數據成員的更改不會影響對象的外部可見常量。例如,它可以用作優化來提供緩存先前計算的值的方法。
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
相關問題
- 1. 修改常量參數參考
- 2. 修改常量對象
- 3. 自修改對象的參考值與否參考值
- 4. 參考變量和對象
- 5. 矢量參考對象?
- 6. 修改參數不參考
- 7. 修改參考返回的向量
- 8. PHP常量參考
- 9. 對象參考
- 10. 參考對象
- 11. 修改參考對象,以避免受保護的二傳手
- 12. 使用jQuery.map修改對象?
- 13. Movilizer - Masterdata參考修改
- 14. Ruby on Rails修改參考
- 15. bad_cast異常參考派生類對象
- 16. 再用對象參考
- 17. js替換對象/更改參考
- 18. Java對象參考
- 19. JavaScript參考對象
- 20. J#對象參考
- 21. 參考JavaScript對象
- 22. SPWorkflowActivationProperties對象參考
- 23. 參考javascript對象
- 24. 參考變量,而不是對象
- 25. 參考變量接收對象
- 26. 使用的參考對象屬性
- 27. 使用方法來更改對象參考值
- 28. MIDL(常量)參考文獻
- 29. 修改參考變量,而不是變量,他們別名
- 30. 併發修改異常與對象
謝謝。你能解釋更多關於'這個功能通常只用於私人成員變量嗎? – 2011-12-29 05:28:20
真正的說。如果你有一個像上面例子那樣的'public mutable'成員變量,那麼'const'並不意味着任何有用的東西,因爲對象的公共部分甚至可以通過'const'引用而明顯改變。另一方面,如果一個'private mutable'成員變量只做內部緩存之前的計算結果,那麼該對象的* public *部分不會明顯地改變行爲。 – 2011-12-29 05:54:08