c++字符串和重载操作符
C++ string and overloaded operators
我正在学习c++库类型string。我正在研究该类型可以执行的操作,其中包括连接。我知道在c++中可以重载操作符以满足类类型的需要,并且我知道字符串字面量在底层是const char数组。因此,我知道string类型定义了一个构造函数,该构造函数接受字符串文本参数并将其转换为字符串,因此我可以使用
初始化字符串:string s="hello!"
这里发生的是一个imppicit转换(通过接受const char*的构造函数)到string,然后执行复制初始化(通过string的复制构造函数)。
到目前为止,一切都很好。(纠正我,如果我得到错误的东西到目前为止)现在,我知道我可以连接两个字符串,或者我可以连接一个字符串和一个字符字面值(反之亦然),一个字符串和一个字符串字面值(所以我认为第一个发生是因为有一个重载+操作符对称地接受一个字符和一个字符串,后者的发生要归功于重载+操作符连接两个字符串和从const char*到字符串的隐式转换)。我的问题是:
1:为什么我不能连接两个字符串字面值?不应该调用带两个字符串的+操作符(并执行两次从const char*到string的隐式转换)吗?
string s="hi"+" there";
2:我试图连接一个字符字面值和一个字符串字面值(调用运算符+接受一个字符和一个字符串),但我只得到垃圾在结果字符串,因为编译器不介意,但结果肯定不是我想要的。
string s='h'+"ello!";
cout<<s<<endl;
我把垃圾扔出去。如果操作符+(char,const string&)存在,应该在隐式转换"ello"到字符串后调用,不是吗?
你能解释一下吗?
1)连接两个字符串字面值
"Hello" + " world"
编译器没有提示它应该查找与std::string
相关的任何内容—它正在查找两个const char[]
对象,并且您不能+
这些对象(或它们可能降级为const char *
)。
2)对char字面值和string字面值使用
operator+
。
(感谢用户dyp指出了正确的方向)
如果你的字面上的指的是char
字面量——例如'a'
——那么你就遇到了C/c++提供的一个更令人惊讶的东西。
考虑: a[i]
等价于i[a]
(这是事实)
所以,如果你写:
'a' + "Hello"
…
"Hello" + 97
…这是一个指向任何地方的指针,即从它构造一个std::string
是未定义的行为。
Borgleader已经给出了一半的答案:
-
当添加两个字符串字量时,编译器只看到两个
const char *
,它们可以被转换为字符串,也可以转换为整数。除非你明确地说你希望它们是字符串,否则你会得到一个错误 -
当添加字符串字面值和字符时,编译器看到一个指针和一个整型数。它知道如何处理这个问题,并对C字符串进行指针运算——这可能不是你所期望的!您有可能在字符数组结束后结束并调用未定义的行为。例子:
"abc" + '0' => "abc" + 48 : 44 positions past the NULL ... "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghij" + '0' => "ij"