[英]Are string literals defined by c++ string class are of type const char[]
[英]Why do string literals (char*) in C++ have to be constants?
我最近一直在學習 C++ 並意識到 C++ 中的字符串文字必須是常量,而在 C 中,它們不是。 這是一個例子。 以下代碼在 C 中有效,但在 C++ 中無效:
char* str = "Hello World";
為了在 C++ 中做同樣的事情,必須使用以下語句:
const char* str = "Hello World";
有人可以解釋為什么嗎?
稍微擴展克里斯蒂安吉本斯的答案......
在 C 中,像"Hello World"
這樣的字符串文字存儲在char
的 arrays 中,這樣它們在程序的生命周期內都是可見的。 字符串文字應該是不可變的,並且某些實現會將它們存儲在只讀 memory 段中(這樣嘗試修改文字的內容將觸發運行時錯誤)。 一些實現不會,並且嘗試修改文字的內容可能不會觸發運行時錯誤(它甚至可能看起來像預期的那樣工作)。 C 語言定義使行為“未定義”,以便編譯器可以自由處理它認為合適的情況。
在 C++ 中,字符串文字存儲在const char
的 arrays 中,因此任何修改文字內容的嘗試都會在編譯時觸發診斷。
正如 Christian 所指出的, const
關鍵字最初不是 C 的一部分。 然而,它最初是 C++ 的一部分,它使使用字符串文字更加安全。
請記住, const
關鍵字並不意味着“將它存儲在只讀內存中”,它僅意味着“這個東西可能不是賦值的目標”。
還要記住,除非它是sizeof
或一元*
運算符的操作數,或者是用於在聲明中初始化字符數組的字符串文字,否則將轉換類型為“ T
的 N 元素數組”的表達式(“decay ") 到類型為“pointer to T
”的表達式,表達式的值將是數組第一個元素的地址。
在 C++ 中,當你寫
const char *str = "Hello, world";
字符串的第一個字符的地址存儲到str
。 您可以將str
設置為指向不同的字符串文字:
str = "Goodbye cruel world";
但你不能做的是修改字符串的內容,比如
str[0] = 'h';
或者
strcpy( str, "Something else" );
C 最初沒有const
關鍵字,因此如果他們在引入關鍵字后將文字更改為需要const
限定,則會破壞遺留代碼。 但是,C 的字符串文字是不可變的,因此更改內容是未定義的行為,即使它不是const
限定的。
另一方面,C++ 是使用const
關鍵字設計的。 最初,C++ 確實允許將字符串文字分配給非const
限定的char *
s,大概是為了與現有的 C 代碼兼容。 然而,從 C++03 標准開始,他們決定棄用此功能,而不是讓不和諧持續下去。 我猜想依賴指向字符串文字的非const
限定char *
s 的遺留 C++ 代碼的數量足夠小,這是一個值得權衡的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.