簡體   English   中英

c ++中的const變量

[英]Const variables in c++

AFAIK我們無法在C中更改常量變量的值。但我面對這個面試問題如下:

在C ++中,我們有程序來改變常量變量的值。 誰能告訴我怎么能這樣做?

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

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

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

這里的行為是明確定義的。

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

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

值得一提的是,當/如果變量可能需要以這種方式使用時,您可以指定變量本身是可變的。 這基本上意味着所討論的變量永遠不是 const限定的,即使它所屬的對象 const限定的。

沒有調用UB就沒有完美的方法來拋棄變量的const根據定義是const

很可能面試官不知道他們在談論什么。 ;-)

您無法更改常量變量的值。 嘗試通過欺騙編譯器來執行此操作,調用未定義的行為。 但編譯器可能不夠聰明,無法告訴你你正在做什么是非法的!

或許,你的意思是:

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

??

如果是這樣,那么它正在改變指針本身的值,這不是常數,而是指向的數據ptr是恆定的,你不能改變它,例如通過寫ptr[2]='W';

面試官正在尋找const_cast 作為一個額外的好處,您可以解釋const_cast有意義的場景,例如const_cast<MyClass *>(this)->doSomething() (雖然IMO不是很干凈,但它可以完全有效),以及可能存在危險的場景例如,拋棄傳遞的const引用的constness,從而破壞函數簽名提供的契約。

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

如果設計不是你的,祝你好運,因為上面的UB評論是現貨。 在嵌入式系統中,const變量可以放在ROM中。 為了使這樣的變量可寫而執行技巧會導致一些引人注目的失敗。 此外,問題超出了簡單的成員變量。 標記為const的方法和/或函數可以在“缺乏恆定性”變得無意義的情況下進行優化。

(把這個“評論作為答案”作為關於不良面試問題的陳述。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM