2013-05-15 264 views
2

我是C++的新手,我指的是Accelerated C++。雖然嘗試的行使問題,其中一個說:在C++中使用「+」連接字符串

Are the following definitions valid? Why or why not? 
const std::string exclam = "!"; 
const std::string message = "Hello" + ", world" + exclam; 

,當我試圖&執行的程序我得到一個錯誤:類型爲二進制運算符+

無效操作數。

但是,下面的代碼工作完全正常:

const std::string hello = "Hello"; 
const std::string message = hello + ", world" + "!"; 

我不是它的執行清楚!爲什麼這種連接在第一種情況下不起作用?

謝謝!我正在使用DEV C++。

+2

爲'std :: string'重載'+'(這就是第二個例子的原因)。第一個例子是試圖對兩個字符串文字('「Hello」'和'「,world」'不是'std :: string'對象)使用'+'。 – birryree

+0

下面的答案解釋了代碼不起作用的原因;我添加了另一種修復代碼的方式。您可以通過添加圓括號來改變操作順序,以確保所有連接都調用了std :: string :: operator +'。 'const std :: string message =「Hello」+(「,world」+ exclam);'但是在這種情況下,最好通過簡單地除去它們之間的'+'來連接文字。 – Praetorian

回答

6

在第一個表達式

"Hello" + ", world" 

編譯器需要找到一個合適的函數諸如operator+(const char *, const char *)。 不存在這樣的函數,所以它不能編譯。

相反地,

hello + ", world" 

正在尋找一個匹配operator+(const std::string&, const char*),並且過載確實存在(它是由std::string提供)。


需要注意的是你,即使你可以寫你自己的過載能力:

(你不能像禁衛軍指出),它不會是一個好主意。

首先,使用原始參數,您將失去ADL(即,如果標準庫將運算符放在名稱空間std中,通常不會在外面看到)。

其次,如果你有其他用自己的字符串表示(如STL預東西一樣RogueWave,或Qt的,等等,等等),他們會同樣有理由爲他們提供超載字符串類型,編譯器將無法在它們之間進行選擇。

+0

您是否嘗試過實施'std :: string運算符+(char const *,char const *)'overload?你可能會[很驚訝](http://www.parashift.com/c++-faq/cant-replace-ops-on-built-ins.html)... – Praetorian

+0

Doh,我寫得非常糟糕,只是一秒鐘。 .. – Useless

3

這是因爲"Hello"不是,當編譯器讀取它時,std::string,但const char * - 這意味着您不能將它用於+

您可以與瑣碎修復:

const std::string message = std::string("Hello") + ... 
+0

什麼是'String'? – 0x499602D2

+0

@ 0x499602D2:輸入錯誤的結果...;) –

0

"Hello"", world"在第一個例子中是const char *對象。由於指針的性質,沒有定義的方式將兩個字符數組一起添加,雖然在邏輯上看起來很好。

在第二示例中,你好是一個std :: string對象,其具有限定的+運算,以便當您寫:

hello + ", world" 

它創建包含兩條內容一個新的std :: string對象。

1

"Hello"不是字符串,因爲它不是std::string類型的對象。這是一個字符串文字,它是一個字符數組。你不能連接兩個文字+,但你可以連接一個std::string與一個數組(反之亦然)。

"Hello" + ", world" + exclam相當於("Hello" + ", world") + exclam,所以不起作用,因爲它試圖連接兩個文字。但是,您可以將它們連接起來,而不需要+運營商:"Hello" ", world" + exclam

hello + ", world" + "!";相當於(hello + ", world") + "!"。它將std::string與文字連接起來;結果是一個新的std::string,然後與第二個文字連接。兩個連接都是允許的。

原因是C++是語言家族的一員,在過去的半個世紀左右,語言家族已經慢慢發展,並且在邊緣仍然殘留着古老語言的殘留物。