回答
在這種情況下,我想我已經解釋了這種情況:試圖改變變量的值這是const給出未定義的行爲。他可能會問的是如何更改一個本身不是const的變量,但是你已經收到一個指向const的指針或引用。在這種情況下,當你是當然變量本身是而不是 const限定,你可以用const_cast
拋棄常量,然後繼續修改。
如果在變量本身是const限定時執行相同的操作,編譯器將允許代碼進行編譯,但結果將是未定義的行爲。嘗試修改變量可能會成功 - 或者它可能會引發異常,中止程序,重新格式化NAS設備的硬盤驅動器或其他任何東西。
也許值得一提的是,當/如果一個變量可能需要以這種方式使用,您可以指定該變量本身是可變的。這基本上意味着有問題的變量是從來沒有 const限定,即使它的一部分對象是 const限定。
還有就是要拋棄一個變量(這是const
定義)的常量性,而不必調用UB
沒有完美的方式最有可能的面試官不知道他們在說什麼。 ;-)
您無法更改常量變量的值。試圖這樣做通過欺騙編譯器,調用未定義的行爲。不過,編譯器可能不夠聰明,不能告訴你你在做什麼是非法的!
或者,也許,你的意思是這樣的:
const char *ptr= "Nawaz";
ptr = "Sarfaraz";
?
如果是這樣,那麼它的改變指針本身,這是不不變,而數據ptr
點是恆定的值,你可以不寫ptr[2]='W';
改變這種狀況爲例。
可以修改const限定類類型對象的可變數據成員:
struct awesome_struct {
awesome_struct() : x(0) { }
mutable int x;
};
int main() {
const awesome_struct a;
a.x = 42;
}
這裏的行爲是明確的。
我在編寫自己的帖子時有這種想法,但不知道如何不使用const成員函數。做得好。 +1! – Nawaz 2011-03-05 17:07:30
面試官正在尋找const_cast
。作爲一個額外的好處,你可以解釋const_cast
有意義的場景,比如const_cast<MyClass *>(this)->doSomething()
(這可以是完全有效的,儘管IMO不是很乾淨),以及可能很危險的場景,比如拋棄常量引用的常量,以及因此違反了您的功能簽名提供的合同。
如果const變量需要改變值,那麼你已經發現了設計中的一個缺陷(在大多數情況下,如果不是全部的話)。如果設計是你的,太棒了! - 你有機會改進你的代碼。
如果設計不屬於你的話,祝你好運,因爲上面的UB評論是真實的。在嵌入式系統中,const變量可以放在ROM中。執行技巧試圖使這種變量可寫,導致一些令人驚歎的失敗。此外,這個問題超出了簡單的成員變量。被標記爲const的方法和/或函數可以被優化,以至於「缺乏常量」變得沒有意義。
(拿這個「帶註釋的回答」作爲面試問題可憐的聲明。)
- 1. 一個const變量
- 2. if(CONST ==變量)或if(變量== CONST)有什麼區別?
- 3. 什麼是const變量?
- 4. const char變量的問題
- 5. 修改一個常量變量(const)
- 6. 瞭解指針常量指針到整型常量(const int的* const的*變量)
- 7. 如何使用const數組而不是const變量?
- 8. Javascript:將對象賦值給const變量vs讓變量
- 9. 訪問靜態變量的Const方法
- 10. const引用變量初始化
- 11. 無法通過JavaScript訪問const變量
- 12. C++靜態const變量和ROMable
- 13. 將const指定給constexpr變量
- 14. C - 設置返回變量爲const
- 15. 評估表達const的變量範圍
- 16. 存儲分配爲const變量
- 17. 由非const成員函數改變的可變變量
- 18. 爲什麼初始化非const和靜態const成員變量而不是靜態成員變量?
- 19. 不可變的數據結構或const變量?
- 20. 靜態const變量在子類中不是常量
- 21. 可能需要引用不同變量的局部靜態const變量
- 22. Const char ...改變了嗎?
- 23. const成員函數可變
- 24. const中的不變性es6
- 25. const array改變問題C++
- 26. 常量性和const指針
- 27. const auto和對象常量
- 28. 在C++中爲const int分配一個指針變量?
- 29. 爲什麼const變量在靜態方法中可用?
- 30. 使用const替代變量聲明的空指針
我真的希望面試將集中在喜歡的人是否具有編程新的熱情,好奇心更重要的事並且還有一定量的EQ。 – 2011-03-05 16:57:39
瞭解const_cast是設計用於測試某些C++知識的系列中非常有效的問題。只有*語言知識測試纔會出現問題。 – Erik 2011-03-05 16:58:43
@Erik所以受訪者很緊張,在採訪中忘記了這件事情,因此沒有得到這份工作,公平嗎?更有趣的是C++中的最佳實踐。 – 2011-03-05 17:00:04