为什么<string>字符串对象需要 #include 而不是字符串文本?
Why is #include <string> needed for string objects but not string literals?
为什么当将
字符串对象用于变量和参数时,您需要#include <string>
,但字符串文字不需要它?例如,您可以说cout << "This is a string literal";
而不#include <string>
。
我正在使用Deitel Brothers的书学习C++并在学习字符数组时提出了这个问题。
字符串
文字不是std::string
对象,它是一个const char
数组。
"This is a string literal"
的类型为 const char[25]
.
在大多数情况下(包括这种情况(,数组隐式衰减为指向其第一个元素的指针,并且const char*
存在operator<<
重载。
困惑的是,"字符串"在C++中意味着几种不同的东西,但过了一段时间(以及拔头发和咬牙切齿(,从上下文中就会清楚地了解预期的含义。
像
"This is a string literal"
这样的字符串文字是const char[25]
类型,而不是std::string
类型。语句cout << "This is a string literal"
实际上调用operator <<(ostream&, const char*)
,字符串文字参数衰减为类型 const char*
。此案不涉及任何std::string
。
相关文章:
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 在编译时检查字符串文本的长度
- 读取字符串文本输入以创建 2D 矢量
- 管理字符串文本的最佳做法
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- 无法在模板参数中定义字符串文本
- 不推荐使用 PTCHAR 的字符串文本
- C++ 字符串文本和常量
- C++20字符串文本模板参数工作示例
- 返回从字符串文本创建的静态string_view是否安全?
- 在处理任何字符大小的模板中使用字符串文本
- 是否保证相同内容字符串文本的存储相同?
- 将以 null 结尾的字节字符串转换为原始字符串文本
- 是否可以创建一个用户定义的文本,将字符串文本转换为 own 类型的数组?
- 使用C++中的模板检测不同的字符串文本
- 无法完全专用化字符串文本的模板
- C++ - 确定 const char* 是指向字符串文本对象还是动态对象
- 是否可以在原始字符串文本中插入转义序列?
- C++带有捕获组的正则表达式字符串文本
- 为什么多维数组中的空字符串文本衰减为空指针?