[英]String concatenation
為什么可以這樣做
const string exclam = "!";
const string str = exclam + "Hello" + " world";
並且不可能做到這一點:
const string exclam = "!";
const string str = "Hello" + " world" + exclam;
我知道(雖然不明白為什么)不允許這樣做:
const string str = "Hello" + " world" + "!";
因為它將被解釋為const char[6] + const char[6] + const char[1]
,所以從另一方面來說,為什么這也是不允許的,或者為什么它使用char[]
而不是string
。
+
運算符是左關聯的(從左到右計算),因此最左邊的+
會首先計算。
exclam
是一個std::string
對象,它重載operator+
以便以下兩個執行連接:
exclam + "Hello"
"Hello" + exclam
這兩個都返回一個包含連接字符串的std::string
對象。
但是,如果“添加”的前兩項是字符串文字,例如:
"Hello" + "World"
不涉及類類型對象(這里沒有std::string
)。 字符串文字被轉換為指針,並且沒有用於指針的內置operator+
。
這是因為您正在連接const char[6]
+ const char[6]
,這是不允許的,正如您所說。
在 C++ 中,字符串文字(引號之間的內容)被解釋為const char[]
s。
您可以使用const char[]
連接string
(反之亦然),因為+
運算符在字符串中被覆蓋,但對於基本類型不能被覆蓋。
const string exclam = "!"; // Initialize a c++ string with an ansi c string
const string str = exclam + "Hello" + " world"; // Using the operator+ method of exclam
您可以這樣做,因為 exclam 的operator+
將返回一個包含“!Hello”的新字符串,您隨后在該字符串上使用“world”作為參數調用operator+
,因此您得到另一個字符串,最后通過以下方式將其分配給 str復制構造函數。
另一方面
const string str = "Hello" + " world" + exclam;
無法執行,因為 "Hello" 只是一個const char *
,它沒有以const char *
作為參數的operator+
。
(新答案,這在 2010 年是不可能的)
你現在可以寫
const string str = "Hello"s + " world"s + "!"s;
// ^ ^ ^
通過在字符串文字后添加s
,您可以告訴編譯器它實際上是std::string
而不是const char[]
。 這意味着您可以在其上調用成員函數。 例如("ABC"s).back()
還有+
除了解釋您觀察的原因的答案之外,我還在這里發布了如何解決這個問題(您可能已經想到了這一點)。
代替
const string str = "Hello" + " world" + exclam;
和
const string str = string("Hello") + " world" + exclam;
所以你要確保第一個操作數是一個string
而不是一個const char[]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.