C++学习笔记----Strings与String View(8)-- std::string_view与临时字符串、string_view文本等

        上一篇文章结束时提了两点,其中一点说,在对象生命周期内string_view指向的字符串要处于存活状态,尽量将string_view存储在string类中,感觉说的有点不清不楚,这篇文章我们再好好讨论一下这个问题。

1、std::string_view与临时字符串

        通过上面几篇文章的介绍,我们知道,string_view中其实只是存储了一个指向字符串的指针及字符串长度,并没有真实存储字符串,所以其指针指向的字符串应该是真实存在并且是可以操作的,临时字符串就不行,因为它不可操作;我们做个类比吧,大家都知道,在数据库中有table,是真实存储数据的,也有view,view是对多个(或单个)表做的一个联合查询(或子查询),如果基于view的table不存在的话,那可想而知,view也是无法完成任务的。好了,我们看一个string_view与临时字符串的例子:

	string s{ "Hello" };
	string_view sv1{ s + " World!" };
	println("{}", sv1);

第二行代码执行过后,sv1中的指针指向了一个临时字符串,第三行进行输出时,就会出现不可预知的结果,有可能会系统崩溃,也有可能会打印出“ello World”,‘H’不见了(我的编译环境下的执行结果就是这样),不管是哪种结果,都不是我们想要的。所以由此可以看出,string_view是要有基础的,其指向的字符串不能是临时的,一定要是可操作的,不能被系统认为可以随时进行回收,要写出漂亮的代码的前提是写出正确的代码,要把命运掌握在自己手中,而不要随波逐流,爱谁谁,那样的话,即使偶尔会正确,也是埋下了不定时的炸弹。

2、string_view文本

        还是回归到本心,临时字符串不行,这也不行,那也不行,那到底怎么给string_view赋初值,而这个初值就是简单用一下而已,好了,C++的玩法也是比较一致的,在常量字符串后面加sv就行了,举例如下:

auto sv{ "My string_view"sv };

要习惯于C++的这种在字符串后面加标记的语法方式,还是很简洁易懂的,继续我们的C++学习之旅吧。

  • 3、非标准字符串

        大家为什么在C++中不用标准的string与string_view呢,先不说其他原因,在我看来,首要原因就是C++编译器太宽容了,兼容了C以及早期的各种对字符串的操作,导致各种非标准字符串在各个时期的代码中层出不穷,也给系统维护带来了各种问题,当然了,这也是C++相对于其他面向对象语言的复杂性所在,这个就不过多讨论了;许多程序员其实是不知道在C++规格中是有string这个单独的类,并且是标准的字符串操作类的存在的,这能怪谁呢?还有一个原因就是,牵涉到字符编码时,如果操作不当,可能会出现乱码,这个后议哈。

        当然了,在现代软件工程中,软件项目一般都是基于框架来进行的,在使用的框架中,字符串操作是最基本的,所以一般都会给出规格,给出实例,这个时候,就不要去谈是否一定要用标准的string类与string_view类了,记住一个放之四海而皆准的道理:不管黑猫白猫,抓住老鼠就是好猫;不看广告,只看疗效,解决问题才是关键。各种框架中的字符串操作,如Microsoft MFC的CString,当然了,它也是为了兼容以前的代码,还有Qt的框架等等,不管用哪种框架,也不管怎么操作字符串,有以下几点还是要记住的:

  1. 永远不要使用C格式的字符串;
  2. 要使用各种框架中提供的字符串功能的标准方式;
  3. 如果使用std::string操作字符串,就要使用std::string_view进行只读字符串的函数传递;使用框架时,也要遵循这个原则,找到相应的类似于std::string_view功能的操作方式,避免不必要的额外开销。

好了,今天的内容就到此结束了,后面我们会对字符串的格式化输出进行详细讲解,下次见喽。

  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值