當函數將參數作爲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. PHP常量參考
- 4. 修改參考對象,以避免受保護的二傳手
- 5. 使用jQuery.map修改對象?
- 6. Movilizer - Masterdata參考修改
- 7. Ruby on Rails修改參考
- 8. bad_cast異常參考派生類對象
- 9. js替換對象/更改參考
- 10. 再用對象參考
- 11. JavaScript參考對象
- 12. J#對象參考
- 13. SPWorkflowActivationProperties對象參考
- 14. 參考JavaScript對象
- 15. 參考javascript對象
- 16. 參考變量,而不是對象
- 17. 參考變量接收對象
- 18. 使用的參考對象屬性
- 19. MIDL(常量)參考文獻
- 20. jquery使用參考變量
- 21. 使用Powershell修改非AD LDAP對象
- 22. 使用事件修改域對象
- 23. 使用遠程方法修改對象
- 24. 使用[] .push.call()修改對象的長度
- 25. 如何修改使用對象* C++中
- 26. 模板函數和常量/非常量參考參數
- 27. 參考和綁定對象
- 28. 對象參考問題
- 29. 參考字符串對象
- 30. 對象參考澄清
謝謝。你能解釋更多關於'這個功能通常只用於私人成員變量嗎? – 2011-12-29 05:28:20
真正的說。如果你有一個像上面例子那樣的'public mutable'成員變量,那麼'const'並不意味着任何有用的東西,因爲對象的公共部分甚至可以通過'const'引用而明顯改變。另一方面,如果一個'private mutable'成員變量只做內部緩存之前的計算結果,那麼該對象的* public *部分不會明顯地改變行爲。 – 2011-12-29 05:54:08