在C ++中使用'+'运算符将字符附加到字符串文字时会发生什么?

时间:2011-03-10 19:12:28

标签: c++ string stl

根据我的阅读,以下代码:

string aggregate = "give" + 'n';

应生成具有值的结果字符串:

“给定的”。

它反而产生垃圾。为什么不发生以下情况?

  1. “give”通过构造函数转换为std :: string,该构造函数接受指向字符数组的指针。

  2. 调用带有std :: string和字符的'+'重载,返回一个新字符串。

  3. 我的理论基于this手册页。

    现在,我听说如果运算符是类的成员,则重载运算符的第一个参数不是构造函数转换的候选者。我相信我在Koenig和Moo读过这篇文章。但是,在这种情况下,我理解'+'运算符是非成员重载。

    我意识到这似乎是一种荒谬的过度复杂化,但我想知道 FOR SURE 当我编写代码时会发生什么。

4 个答案:

答案 0 :(得分:6)

首先评估表达式"give" + 'n',将(int)'n'添加到字符串常量"give"的地址。该指针算术的结果被赋予字符串对象。不会引发错误,因为结果是const char*类型。

您应该习惯于在=右侧考虑实际分配之前发生的所有事情(或本例中的初始化)。

您需要以下内容:

// construct the string object first
std::string aggregate = "give";

// then append the character
aggregate += 'n';

或者,首先显式构建一个字符串对象:

std::string aggregate = std::string("give") + 'n';

答案 1 :(得分:4)

表达式左侧有std::string这一事实与第一步无关:"give"const char[5],它会衰减为const char* } 'n'char,即整数类型。向指针添加整数只会添加到指针的地址。结果再次是const char*类型,然后隐式转换为std::string

基本上,您的代码相当于:

const char* c = "a string" + 'n';
std::string s = c;

因此,要达到预期的效果,请尝试

std::string s = std::string("a string") + 'n';

答案 2 :(得分:2)

您将整数'n'添加到文字“给”的地址。

尝试使用:

string aggregate = "long string long string long string long string long string long string long string " + 'A';

这应该说明发生了什么。

答案 3 :(得分:1)

该代码不符合您的想法。

它需要字符串文字"give"然后有效地降级为const char[5],然后将'n'的整数值添加到该指针。然后它接受新的垃圾指针并尝试从中创建一个字符串。

您想要string aggregate = std::string("give") + 'n';