2011-03-05 62 views
2

AFAIK我們不能在C. 改變一個恆定變量的值但我如下面對此面試問題:CONST變量++

在C++中,我們有程序修改常數變量的值。 有人能告訴我我們該怎麼做?

+7

我真的希望面試將集中在喜歡的人是否具有編程新的熱情,好奇心更重要的事並且還有一定量的EQ。 – 2011-03-05 16:57:39

+0

瞭解const_cast是設計用於測試某些C++知識的系列中非常有效的問題。只有*語言知識測試纔會出現問題。 – Erik 2011-03-05 16:58:43

+0

@Erik所以受訪者很緊張,在採訪中忘記了這件事情,因此沒有得到這份工作,公平嗎?更有趣的是C++中的最佳實踐。 – 2011-03-05 17:00:04

回答

7

在這種情況下,我想我已經解釋了這種情況:試圖改變變量的值這是const給出未定義的行爲。他可能會問的是如何更改一個本身不是const的變量,但是你已經收到一個指向const的指針或引用。在這種情況下,當你是當然變量本身是而不是 const限定,你可以用const_cast拋棄常量,然後繼續修改。

如果在變量本身是const限定時執行相同的操作,編譯器將允許代碼進行編譯,但結果將是未定義的行爲。嘗試修改變量可能會成功 - 或者它可能會引發異常,中止程序,重新格式化NAS設備的硬盤驅動器或其他任何東西。

也許值得一提的是,當/如果一個變量可能需要以這種方式使用,您可以指定該變量本身是可變的。這基本上意味着有問題的變量是從來沒有 const限定,即使它的一部分對象 const限定。

6

還有就是要拋棄一個變量(這是const定義)的常量性,而不必調用UB

沒有完美的方式最有可能的面試官不知道他們在說什麼。 ;-)

3

您無法更改常量變量的值。試圖這樣做通過欺騙編譯器,調用未定義的行爲。不過,編譯器可能不夠聰明,不能告訴你你在做什麼是非法的!

或者,也許,你的意思是這樣的:

const char *ptr= "Nawaz"; 
ptr = "Sarfaraz"; 

如果是這樣,那麼它的改變指針本身,這是不變,而數據ptr點是恆定的值,你可以不寫ptr[2]='W';改變這種狀況爲例。

8

可以修改const限定類類型對象的可變數據成員:

struct awesome_struct { 
    awesome_struct() : x(0) { } 
    mutable int x; 
}; 

int main() { 
    const awesome_struct a; 
    a.x = 42; 
} 

這裏的行爲是明確的。

+0

我在編寫自己的帖子時有這種想法,但不知道如何不使用const成員函數。做得好。 +1! – Nawaz 2011-03-05 17:07:30

0

面試官正在尋找const_cast。作爲一個額外的好處,你可以解釋const_cast有意義的場景,比如const_cast<MyClass *>(this)->doSomething()(這可以是完全有效的,儘管IMO不是很乾淨),以及可能很危險的場景,比如拋棄常量引用的常量,以及因此違反了您的功能簽名提供的合同。

0

如果const變量需要改變值,那麼你已經發現了設計中的一個缺陷(在大多數情況下,如果不是全部的話)。如果設計是你的,太棒了! - 你有機會改進你的代碼。

如果設計不屬於你的話,祝你好運,因爲上面的UB評論是真實的。在嵌入式系統中,const變量可以放在ROM中。執行技巧試圖使這種變量可寫,導致一些令人驚歎的失敗。此外,這個問題超出了簡單的成員變量。被標記爲const的方法和/或函數可以被優化,以至於「缺乏常量」變得沒有意義。

(拿這個「帶註釋的回答」作爲面試問題可憐的聲明。)