连接两个string文字
我对编程非常陌生,正在阅读Koenig的Accelerated C ++。 无论如何,我正在学习string,他写道:“新的想法是,我们可以使用+连接一个string和一个string – 或者,对于这个问题,两个string(但不是两个string)。
好吧,我想这是有道理的。 现在到两个单独的练习,旨在阐明这一点。
以下定义是否有效?
const string hello = "Hello"; const string message = hello + ",world" + "!";
现在,我试图执行上述,它的工作! 所以我很高兴。
然后我试着做下一个练习;
const string exclam = "!"; const string message = "Hello" + ",world" + exclam;
这没有奏效。 现在我明白了这个事实,你不能连接两个string文字,但我不明白为什么我设法得到第一个例子工作(不是“,世界”和“! “两个string?不应该这个没有工作吗?),但不是第二个。
谢谢!
const string message = "Hello" + ",world" + exclam;
+
运算符具有从左到右的关联性,所以等价的括号expression式是:
const string message = (("Hello" + ",world") + exclam);
正如你所看到的,两个string文字"Hello"
和",world"
是先“添加”,因此错误。
前两个string之一必须是一个std::string
对象:
const string message = string("Hello") + ",world" + exclam;
或者,您可以强制第二个加号首先通过将该部分的expression式括起来进行评估:
const string message = "Hello" + (",world" + exclam);
这是有道理的,你的第一个例子( hello + ",world" + "!"
)是因为std::string
( hello
)是最左边+
的参数之一。 这个+
被评估,结果是一个带有连接string的std::string
对象,然后得到的std::string
被连接到"!"
。
至于你为什么不能使用+
连接两个string文字,这是因为一个string文字只是一个字符数组( const char [N]
,其中N
是string的长度加1,为空终止符)。 在大多数情况下使用数组时,它会转换为指向其初始元素的指针。
所以,当你试图做"Hello" + ",world"
,你真正要做的就是把两个const char*
s加在一起,这是不可能的(将两个指针加在一起意味着什么?如果是这样,它不会做你想做的事情。
请注意,您可以通过将string文字彼此相邻放置来连接string文字; 例如,以下两个是等价的:
"Hello" ",world" "Hello,world"
如果你有一个很长的string,你想分解成多行,这很有用。 但是它们必须是string:这不适用于const char*
指针或const char[N]
数组。
你应该时刻注意types 。
尽pipe它们看起来都像string,但"Hello"
和",world"
是文字 。
在你的例子中, exclam
是一个std::string
对象。
C ++有一个运算符重载,它接受一个std::string
对象并向其中添加另一个string。 当你将一个std::string
对象连接到一个文字时,它会为文字进行适当的转换。
但是,如果您试图连接两个文字,编译器将无法find一个需要两个文字的操作符。
你的第二个例子不起作用,因为没有两个string文字的operator +
。 请注意,string文字不是string
types,而是types为const char *
。 如果你修改它,你的第二个例子将工作:
const string message = string("Hello") + ",world" + exclam;
在情况1中,由于操作的顺序,你得到:
(hello +“,world”)+“!” 解决你的问题+“!” 最后打个招呼
在情况2中,正如詹姆斯指出的那样,你会得到:
(“Hello”+“world”)+ exclam这是2个string的串联。
希望这是明确的:)
string(或者更准确地说, std::string
)和字符字面量之间的区别在于后者没有定义+
运算符。 这就是第二个例子失败的原因。
在第一种情况下,编译器可以find一个合适的operator+
,第一个参数是一个string
,第二个是字符文字( const char*
),所以它使用了。 该操作的结果又是一个string
,所以当添加"!"
时重复相同的技巧"!"
到它。