2013-05-15 247 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++是语言家族的一员,在过去的半个世纪左右,语言家族已经慢慢发展,并且在边缘仍然残留着古老语言的残留物。