👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨
在我模拟实现string
类的时候,我发现了一个神奇的事情:
int main()
{
string s1("hello string");
s1 += '\0';
s1 += "world";
cout << "长度为:" << s1.size() << endl;
for (size_t i = 0; i < s1.size(); i++)
{
cout << s1[i];
}
cout << endl;
cout << s1 << endl;
return 0;
}
【输出结果】
以C语言角度来看,字符串以‘\0’
为结束标志,应该输出hello string
,而string
类的字符串竟然算上了'\0'
,并且是与size
有关。
vs
的输出可能对'\0'
进行了优化,监视窗口能更好观察效果。
为了能更好的对比结果,可以将string
类转化为const char*
,也就是C语言类型的字符串
因此,我们因得出结论:
C-style string
:C语言的字符串是以字符数组的形式存储的,没有内建的字符串类型。'\0'
是空字符,也被称为字符串终止符,用于表示字符串的结束。在遍历一个字符数组时,可以通过检查是否遇到了'\0'
来确定字符串何时结束。string
:C++引入了std::string
类作为字符串类型,它可以自动追踪字符串的长度,并且不需要以'\0'
结尾来表示字符串的结束。std::string
类内部会维护一个表示字符串长度的成员变量size
,因此可以动态地改变字符串的长度而不需要手动添加终止符。
一些误区:
当某些人看完这篇文章,并自己做实验可能就会写出以下代码并产生疑问:
#include <iostream>
#include <string>
using namespace std;
int main()
{
// 代码片段1:
string s1("hello\0string");
cout << s1 << endl;
// 代码片段2:
string s2 = "hello w\0orld";
cout << s2 << endl;
return 0;
}
【输出结果】
有人就会发出疑问,开头不是讲过了,string
类会算上'\0'
,那对象s1
会输出hello string
和s2
会输出hello w orld
。
有这个问题的人就是对string类还不够熟悉。
s1
是由用C字符串构造,而C字符串是以'\0
为结束标志,因此实际上是拿"hello"
拷贝构造s1
同样的道理,s2
也是由C字符串来赋值重载的,因此实际是拿“hello w”
来赋值的。