簡體   English   中英

字符串連接

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

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