在C++中使用“+”连接字符串
我是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++。
在第一个表达式
"Hello" + ", world"
编译器需要找到一个合适的函数诸如operator+(const char *, const char *)
。 不存在这样的函数,所以它不能编译。
相反地,
hello + ", world"
正在寻找一个匹配operator+(const std::string&, const char*)
,并且过载确实存在(它是由std::string
提供)。
需要注意的是你,即使你可以写你自己的过载能力:
(你不能像禁*指出),它不会是一个好主意。
首先,使用原始参数,您将失去ADL(即,如果标准库将运算符放在名称空间std
中,通常不会在外面看到)。
其次,如果你有其他库用自己的字符串表示(如STL预东西一样RogueWave,或Qt的,等等,等等),他们会同样有理由为他们提供超载字符串类型,编译器将无法在它们之间进行选择。
您是否尝试过实施'std :: string运算符+(char const *,char const *)'overload?你可能会[很惊讶](http://www.parashift.com/c++-faq/cant-replace-ops-on-built-ins.html)... – Praetorian
Doh,我写得非常糟糕,只是一秒钟。 .. – Useless
这是因为"Hello"
不是,当编译器读取它时,std::string
,但const char *
- 这意味着您不能将它用于+
。
您可以与琐碎修复:
const std::string message = std::string("Hello") + ...
什么是'String'? – 0x499602D2
@ 0x499602D2:输入错误的结果...;) –
"Hello"
和", world"
在第一个例子中是const char *对象。由于指针的性质,没有定义的方式将两个字符数组一起添加,虽然在逻辑上看起来很好。
在第二示例中,你好是一个std :: string对象,其具有限定的+运算,以便当您写:
hello + ", world"
它创建包含两条内容一个新的std :: string对象。
"Hello"
不是字符串,因为它不是std::string
类型的对象。这是一个字符串文字,它是一个字符数组。你不能连接两个文字+
,但你可以连接一个std::string
与一个数组(反之亦然)。
"Hello" + ", world" + exclam
相当于("Hello" + ", world") + exclam
,所以不起作用,因为它试图连接两个文字。但是,您可以将它们连接起来,而不需要+
运营商:"Hello" ", world" + exclam
hello + ", world" + "!";
相当于(hello + ", world") + "!"
。它将std::string
与文字连接起来;结果是一个新的std::string
,然后与第二个文字连接。两个连接都是允许的。
原因是C++是语言家族的一员,在过去的半个世纪左右,语言家族已经慢慢发展,并且在边缘仍然残留着古老语言的残留物。
为'std :: string'重载'+'(这就是第二个例子的原因)。第一个例子是试图对两个字符串文字('“Hello”'和'“,world”'不是'std :: string'对象)使用'+'。 – birryree
下面的答案解释了代码不起作用的原因;我添加了另一种修复代码的方式。您可以通过添加圆括号来改变操作顺序,以确保所有连接都调用了std :: string :: operator +'。 'const std :: string message =“Hello”+(“,world”+ exclam);'但是在这种情况下,最好通过简单地除去它们之间的'+'来连接文字。 – Praetorian