c++字符串和重载操作符

C++ string and overloaded operators

本文关键字:操作符 重载 字符串 c++      更新时间:2023-10-16

我正在学习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已经给出了一半的答案:

  1. 当添加两个字符串字量时,编译器只看到两个const char *,它们可以被转换为字符串,也可以转换为整数。除非你明确地说你希望它们是字符串,否则你会得到一个错误

  2. 当添加字符串字面值和字符时,编译器看到一个指针和一个整型数。它知道如何处理这个问题,并对C字符串进行指针运算——这可能不是你所期望的!您有可能在字符数组结束后结束并调用未定义的行为。例子:

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