gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:37:00 24 4
gpt4 key购买 nike

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

string s="hello!"

这里发生的是隐式转换(通过采用 const char* 的构造函数)到字符串,然后执行复制初始化(通过字符串的复制构造函数)。

到目前为止一切顺利..(如果我到目前为止有什么不对,请纠正我)

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

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

string s="hi"+" there";

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

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

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

你能解释一下吗?

最佳答案

1) Concatenating two string literals.

"Hello" + " world"

编译器没有提示它应该寻找与std::string相关的任何东西——它正在寻找两个const char[] 对象,并且您不能 + 那些(或者 const char * 它们可能会降级为)。

2) Using operator+ on a char literal and a string literal.

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

如果您literally 指的是 char 文字——例如'a' —— 那么您将与 C/C++ 必须提供的更令人惊讶的事情之一发生冲突。

考虑:a[i] 等同于 i[a](这是事实。)

所以,如果你写:

'a' + "Hello"

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

"Hello" + 97

...这是一个指向任何地方的指针,即从它构造一个 std::string 是未定义的行为。

关于C++ 字符串和重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32099413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com