C ++字符串和重载运算符

时间:2015-08-19 15:11:14

标签: c++ string operator-overloading string-concatenation

我正在研究C ++库类型字符串。我正在研究类型可以执行的操作,其中包括串联。 我知道在C ++中运算符可以重载以满足类类型需求,并且我知道字符串文字是引擎盖下的const char数组。 所以,我知道字符串类型定义了一个构造函数,它接受一个字符串文字参数并将其转换为一个字符串,这样我就可以使用以下命令初始化一个字符串:

string s="hello!"

这里发生的是一个impicit转换(通过带有const char *的构造函数)到string,然后执行复制初始化(通过string的copy-constructor)。

到目前为止一直很好......(如果到目前为止我弄错了,请纠正我)

现在,我知道我可以连接两个字符串,或者我可以连接一个字符串和一个char文字(反之亦然)和一个字符串和一个字符串文字(所以我想第一次发生是因为有一个重载的+运算符对称地获取一个char和一个字符串,后者发生在多个+ opeartor连接两个字符串和从const char *到string的隐式转换。我的问题是:

1:为什么我不能连接两个字符串文字?不应该调用带有两个字符串的operator +(并且从const char *到string执行两次隐式转换)?

string s="hi"+" there";

2:我试图连接一个char文字和一个字符串文字(调用运算符+,它接受一个字符串和一个字符串)但是我只得到结果字符串中的垃圾,因为编译器不介意,但结果是当然不是我想要的。

string s='h'+"ello!";
cout<<s<<endl;

我得到了垃圾。如果运算符+(char,const string&amp;)存在,应该在隐式将“ello”转换为字符串之后调用它不应该吗?

你可以解释一下吗?

2 个答案:

答案 0 :(得分:2)

  

1)连接两个字符串文字。

"Hello" + " world"

编译器没有暗示它寻找与std::string相关的任何内容 - 它正在查看两个const char[]个对象,而你不能{{1}那些(或+他们可以被降级为。)

  

2)在char文字和字符串文字上使用const char *

(感谢用户dyp指向正确的方向。)

如果字面意思表示operator+字面值 - 例如char - 那么你就会碰到C / C ++提供的一个更令人惊讶的事情。

考虑: 'a'相当于a[i](这是事实。)

所以,如果你写:

i[a]

......相当于(在ASCII中)......

'a' + "Hello"

...这是指向无处的指针,即从中构造"Hello" + 97 是未定义的行为。

答案 1 :(得分:1)

Borgleader已经给出了一半的评论答案:

  1. 添加两个字符串litterals时,编译器只能看到两个const char *,它们可以转换为字符串,但也可以转换为整数。因此,除非您明确表示您希望将它们作为字符串,否则会出现错误

  2. 添加字符串litteral和char时,编译器会看到一个指针和一个整数。它知道如何处理它并在你的C字符串上做指针算术 - 这可能不是你所期望的!您有可能在char数组的末尾结束并调用未定义的行为。例子:

    "abc" + '0' => "abc" + 48 : 44 positions past the NULL ...
    "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghij" + '0' => "ij"