添加字符串和文字(C++)

Adding strings and literals (C++)

本文关键字:C++ 文字 字符串 添加      更新时间:2023-10-16

在《C++初级读本》一书中,我看到这样一句话:"当我们混合字符串和字符串或字符文字时,每个+运算符至少有一个操作数必须是字符串类型">

我注意到以下内容无效:

#include<string>
int main()
{
using std::string;
string welcome = "hello " + "world";    //example 1
string short_welcome = 'h' + 'w';      //example 2
return 0;
}
  • 问题1:为什么示例1生成错误,因为两个操作数字符串是文字吗
  • 问题2:为什么至少有一个操作数必须是字符串
  • 问题3:为什么示例2也生成错误

我只想了解幕后发生了什么。

在第一种情况下,"hello""world"而不是std::string!按照您编写它们的方式,它们是char数组。

克服这一问题的一种方法是将它们明确定义为字符串文字:

string welcome = "hello "s + "world"s;    //example 1

这是std::string的一部分,定义为operator""。但是你需要添加using namespace std::string_literals;才能使用它

其余部分将在其他答案中解释。

只能重载用户定义类型的运算符,例如类std::string

所以这些基本类型的运算符

"hello " + "world"
'h' + 'w'

不能过载。

在第一个表达式中,字符串文字被转换为指向其第一个元素的指针。然而,二进制运算符+并没有为指针定义。

在第二个表达式中,字符文字被转换为整数,结果是一个整数。但是类std::string没有接受整数的隐式构造函数。

你可以写例如

string welcome = std::string( "hello " ) + "world"; 

string welcome = "hello " + std::string( "world" ); 

string short_welcome( 1, 'h' );
short_welcome += 'w';

文字字符串实际上是常量字符的数组。因此,它们衰减为指向其第一个元素的指针。添加两个字符串文字就是添加这些指针。结果是指向某个完全不相关的位置的指针。

对于字符,它们首先被提升为int,然后作为整数相加,结果是int


对于第一个示例,当您执行"hello " + "world"时,实际上相当于&(("hello ")["world"])。这没有任何意义,添加文字字符串也没有任何意义。