连接两个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::stringhello )是最左边+的参数之一。 这个+被评估,结果是一个带有连接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文字不是stringtypes,而是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 ,所以当添加"!"时重复相同的技巧"!" 到它。