簡體   English   中英

有關const_cast <>的行為

[英]Behaviour about const_cast<>

我寫了一個小問題來檢查const數據成員上const_cast的行為。

using namespace std;


     class myString{
         public:
                 myString(char * str)
                 {
                         p=str;
                 }
                 const char * getString(){
                         return p;
                 }
         private:
                 const char *p;
 } ;


int main()
{
        char *p=(char*)malloc(8);
        cin>>p;
        myString *m= new myString(p);
        char *s =const_cast<char*>(m->getString());
        s[6]='y';
        cout<<s<<endl;
        return 0;
}

運行該程序后,我將其輸出為“ yogendra”(8個字母的字符串)。 我得到的輸出為“ yogendya”。現在我很懷疑。 通過const_cast <>,我們可以覆蓋數據成員本身的行為,因為在轉換后,字符串仍為const char *,我仍然可以對其進行修改。

您已經准確地描述了const_cast的用途-它使您可以從某些內容中刪除const並進行修改。 您有責任不濫用這種權力。 :-)

(在您的情況下,這並不適用,但是請注意,使用const_cast可能會導致崩潰-例如:

const char *c = "Hello";
char *s = const_cast<char*>(c);
s[0] = 'h';

可能會崩潰,因為編譯器可以將字符串文字放入只讀內存中。)

是的,您可以以這種方式使用const_cast<> ,並且不會出現未定義的行為,因為您的類中const char*指向的對象確實是char*類型的非const。 不過要小心:。 C ++標准。 §7.1。5.1 / 4說

除了可以聲明任何聲明為可變的類成員(7.1.1)之外,任何在其生存期(3.8)內修改const對象的嘗試都會導致未定義的行為

安全使用const_cast是將const從const引用轉換為非const對象:當存在非const對象並且您具有const ref時,可以從此安全地轉換const

如果你說

char *s =const_cast<char*>(m->getString());

然后從指針中刪除“ const”,然后將s聲明為指向char的指針,這是一個可寫的字符串。 所以下一行

s[6]='y';

很好。 要保留const,您應該將s聲明為const指針

const char *s = m->getString();

在這種情況下,您將無法覆蓋常量字符串(錯誤:分配只讀位置)。 我以為那是你想要的? const_cast將僅添加/刪除const ,在您的情況下,將其刪除。

暫無
暫無

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

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