我正在研究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”转换为字符串之后调用它不应该吗?
你可以解释一下吗?答案 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已经给出了一半的评论答案:
添加两个字符串litterals时,编译器只能看到两个const char *
,它们可以转换为字符串,但也可以转换为整数。因此,除非您明确表示您希望将它们作为字符串,否则会出现错误
添加字符串litteral和char时,编译器会看到一个指针和一个整数。它知道如何处理它并在你的C字符串上做指针算术 - 这可能不是你所期望的!您有可能在char数组的末尾结束并调用未定义的行为。例子:
"abc" + '0' => "abc" + 48 : 44 positions past the NULL ...
"abcdefghijabcdefghijabcdefghijabcdefghijabcdefghij" + '0' => "ij"