[英]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.