+ -ing字符串和<< -ing字符串在c ++中有什么区别吗?

时间:2009-04-08 03:25:23

标签: c++ text concatenation cout

以下片段的效果之间有什么区别:

cout << "Some text" << s1 << "some more text\n";

cout << "Some text" + s1 + "some more text\n";

4 个答案:

答案 0 :(得分:15)

operator + on strings的结果是一个新字符串。因此,在示例中

cout << "Some text" + s1 + "some more text\n";

在将整个内容写入cout之前,会创建两个新字符串(意味着内存分配)。在你的第一个例子中,所有内容都直接写入cout而没有不必要的内存分配。

答案 1 :(得分:5)

请考虑以下事项:

cout << "Some text" + " " + "some more text\n";

它不会做你的想法。运算符+并不总是意味着连接。

编辑:当应用于原始字符串时,operator +不会连接 - 它会添加指向字符串的指针的地址。结果几乎可以保证是无意义的,因为它指向与任何原始字符串无关的内存区域。幸运的是,它会使你的程序崩溃。

编辑2:显然,自从我犯了这个错误以来已经很长时间了。结果是如此荒谬,以至于编译器拒绝编译它。

答案 2 :(得分:2)

是的,string operator+ (const char* lhs, const string& rhs)创建并返回一个未命名的临时字符串对象。

cout << "Some text"调用ostream&amp; ostream :: operator&lt;&lt;(const char * const)并返回ostream引用。

cout << "Some text" << s1 << "some more text\n";

ostream::operator<<( "Some text").operator<<(s1).operator<<("some more text\n"),三次调用cout,调用两个不同的op&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;需要const* char* const和op&lt;&lt;需要const string&。没有内存分配,唯一的复制是cout的缓冲区。

cout << "Some text" + s1 + "some more text\n";

是临时字符串对象上的ostream::operator<<(t1)我将调用 t1 ,其中t1是来自::operator+ ( "Some text", s1).operator+("some more text\n")的临时结果。 (注意第一个运算符+不是字符串的成员,而是命名空间范围内的op +(const char * const,const string&amp;)。它返回一个字符串,所以第二个+“是string :: operator +(const char * const) )。)

因此,在此代码中创建(然后销毁)两个临时字符串对象。这意味着字符串的两个内部表示(因此两个内存分配)和两个副本两个新分配的内存(除了复制到cout的缓冲区)。

答案 3 :(得分:1)

第二个连接字符串然后将它们发送到cout,这是一个性能命中,对于大字符串可能非常大。如果可以的话,你总是想要使用第一个表格。