文章目录

  • 前言
  • 一、操作字符串
  • 二、查询字符串数据
  • 三、字符串的转换
  • 四、NULL字符串和空(empty)字符串的区别
  • 五、隐式共享
  • 六、内存分配策略

前言

标准C++提供了两种字符串:一种是C语言风格的以"\0"字符结尾的字符数组,一种是字符串类String。
QString类保存16位Unicode值,提供了丰富的操作、查询和转换等函数;还进行了使用隐式共享(implicit sharing)、高效的内存分配策略等多方面的优化。


一、操作字符串

(1)QString提供了一个二元的"+“操作符用于组合两个字符串,并提供了一个”+=“操作符用于将一个字符串追加到另一个字符串的末尾。
(2)QString::append()函数具有与”+=“操作符同样的功能,实现一个字符串的末尾追加另一个字符串。
(3)组合字符串的另一个函数是QString::sprintf(),此函数支持的格式定义符和C++库中的函数sprintf()定义的一样。
(4)Qt还提供了另一种方便的字符串组合方式,使用QString::arg()函数。通常,相对于QString::sprintf(),QString::arg()函数是比较好的解决方案,因为其类型安全,完全支持Unicode,且允许改变”%n"参数的顺序。
示例:

QString str;
str=QString("%1 was born in %2.").arg("Poro").arg(1995);

(5)QString也提供了一些其他组合字符串的方法,包括:
  insert()函数:在原字符串特定位置插入另一个字符串;
  prepend()函数:在原字符串开头插入另一个字符串;
  replace()函数:用指定的字符串代替原字符串中的某些字符。
(6)去掉一个字符串两端的空白字符(回车字符"\n"、换行字符"\r"、制表符"\t"、空格字符" “):
  QString::trimmed()函数:移除字符串两端的空白字符;
  QString::simplified()函数:移除字符串两端的空白字符,使用单个空格字符” "代替字符串中出现的空白字符。

二、查询字符串数据

(1)QString::startsWith()函数判断一个字符串是否以某个字符串开头;两个参数分别为:第一个参数指定一个字符串,第二个参数指定是否大小写敏感(默认大小写敏感),判断是返回true。
(2)QString::endsWith()函数判断一个字符串是否以某个字符串结尾。
(3)QString::contains()函数判断一个指定的字符串是否出现过。
(4)比较两个字符串,方法如下:
  operator<(const QString&):比较一个字符串是否小于另一个字符串;是返回true。
  operator<=(const QString&):比较一个字符串是否小于等于另一个字符串;是返回true。
  operator==(const QString&):比较两个字符串是否相等;是返回true。
  operator>=(const QString&):比较一个字符串是否大于等于另一个字符串;是返回true。
  localeAwareCompare(const QString&, const QString&):静态函数,比较前后两个字符串。若前面字符串小于后面字符串,则返回负整数值;若相等则返回0;若大于则返回正整数值。该函数的比较是基于本地字符集的。
  compare(const QString&, const QString&, QT::CaseSensitivity):该函数可以指定是否进行大小写比较,而大小写比较完全基于字符的Unicode编码值,返回值类似于上一函数。

三、字符串的转换

(1)QString::toInt()函数将字符串转换为整型数值;该函数两个参数分别为:第一个参数是一个bool类型的指针,用于返回转换的状态,转换成功为true,否则为false;第二个参数指定了转换的基数,当基数设置为0时,将会使用C语言的转换方法,即 若字符串以"0x"开头,基数为16;若字符串以"0"开头,基数为8;其他情况基数一律为10。
  类似函数还有toDouble()、toFloat()、toLong()、toLongLong()等。
(2)QString提供的字符编码集的转换函数将会返回一个const char类型版本的QByteArray,即构造函数QByteArray(const char)构造的QByteArray对象。
  QByteArray类具有一个字节数组,既可以存储原始字节,也可以存储以"\0"结尾的8位字符串,支持隐式共享。
  转换函数有以下几种:
  toAscii():返回一个ASCII编码的8位字符串
  toLatin1():返回一个Latin-1(ISO8859-1)编码的8位字符串
  toUtf8():返回一个UTF-8编码的8位字符串(UTF-8支持整个Unicode字符集)
  toLocal8Bit():返回一个系统本地编码的8位字符串

四、NULL字符串和空(empty)字符串的区别

NULL字符串就是使用QString的默认构造函数或者使用"(const char*)0"作为参数的构造函数创建的QString字符串对象;
空字符串是一个大小为0的字符串;
一个NULL字符串一定是一个空字符串,而一个空字符串未必是一个NULL字符串。
示例:

QString().isNull();      //结果为true
QString().isEmpty();    //结果为true
QString("").isNull(); //结果为false
QString("").isEmpty();    //结果为true

五、隐式共享

  隐式共享又称回写复制。当两个对象共享同一份数据(通过浅拷贝实现数据块共享)时,如果数据不改变,则不进行数据的复制;而当某个对象需要改变数据时,则执行深拷贝。
  深拷贝是指生成对象的一个完整的复制品;浅拷贝是指一个引用复制。
示例:

QString str1 = "data";    //初始化一个内容为"data"的字符串
QString str2 = str1;   //(a)
str2[3] = 'e';           //(b)
str2[0] = 'f';           //(c)
str1 = str2;           //(d)

(a)对str2赋值时,发生一次浅拷贝;两个QString对象都指向同一个数据结构;数据结构中除保存字符串外,还保存一个引用计数器,此时计数器为2。
(b)对str2修改时,发生一次深拷贝;str2对象指向一个新的数据结构。
(c)对str2修改时,不会引起任何形式的复制。
(d)将str2赋值给str1,str1将它指向的数据结构的引用计数器修改为0,其所指向的数据结构将会从内存中释放掉。

六、内存分配策略

  QString在一个连续的内存块中保存字符串数据。当字符串的长度不断增长时,QString需要重新分配内存空间;分配策略如下:

  • 每次分配4个字符空间,知道大小为20;
  • 在20~4084之间,QString分配的内存块大小以2倍的速度增长;
  • 从4084开始,每次以2048个字符大小(4096字节,即4KB)的步长增长。

QT5开发及实例学习之三字符串类相关推荐

  1. QT5开发及实例学习之十一Qt5文件操作功能

    文章目录 一.新建文件 二.打开文件 三.打印文件 1. 文本打印 2. 图像打印 一.新建文件   实现新建文件功能的函数 showNewFile() 如下: void ImgProcessor:: ...

  2. Qt5开发及实例学习之标准颜色对话框类QColorDialog:选择某种颜色

    2019独角兽企业重金招聘Python工程师标准>>> 1.新建"QT GUI",基类选择"QDialog',取消"创建界面" 2. ...

  3. QT5开发及实例学习之八基本对话框(一)

    文章目录 前言 一.标准文件对话框类 二.标准颜色对话框类 三.标准字体对话框类 四.标准输入对话框类 1.标准字符串输入对话框 2.标准条目选择对话框 3.标准int类型输入对话框 4.标准doub ...

  4. QT5开发及实例学习之十八显示Qt5 SVG格式图片

      SVG 的英文全称是 Scalable Vector Graphics,即可缩放的矢量图形.它是由万维网络联盟 ( World Wide Web Consortium, W3C ) 在 2000 ...

  5. QT5开发及实例学习之十七Qt5双缓冲机制

    文章目录 一.原理与设计 二.绘图区的实现 三.主窗口的实现 一.原理与设计   所谓双缓冲机制,是指在绘制控件时,首先将要绘制的内容绘制在一个图片中,再将图片一次性地绘制到控件上.在早期的 Qt 版 ...

  6. QT5开发及实例学习之十六Qt5基础图形的绘制

    文章目录 前言 一.绘图框架设计 二.绘图区的实现 三.主窗口的实现 前言   设计界面,区分各种形状及画笔颜色.画笔线宽.画笔风格.画笔顶帽.画笔连接点.填充模式.铺展效果.画刷颜色.画刷风格设置等 ...

  7. QT5开发及实例学习之十三Qt5文本编辑功能

    文章目录 前言 一.设置字体 二.设置字号 三.设置文字加粗 四.设置文字斜体 五.设置文字加下画线 六.设置文字颜色 七.设置字符格式 前言   在编写包含格式设置的文本编辑程序时,经常用到的 Qt ...

  8. QT5开发及实例学习之十Qt5主窗口构成

    文章目录 一.基本元素 1.菜单栏 2.状态栏 3.工具栏 4.锚接部件 5.中心部件 6.激活上下文菜单 二.文本编辑器示例 三.菜单与工具栏的实现 1. 动作(Action)的实现 2. 菜单(M ...

  9. QT5开发及实例学习之九基本对话框(二)

    文章目录 前言 一.工具盒类 二.进度条 三.调色板与电子钟 1.QPalette类 2.QTime类 四.可扩展对话框 五.不规则窗体 六.程序启动画面(QSplashScreen) 前言   本章 ...

最新文章

  1. 文件操作:在某手诗文中插入一句话
  2. python tabula 使用方法_Python中os.walk()的使用方法
  3. 跳一跳python源码下载_python 微信跳一跳和源码解读
  4. python练习笔记——利用信号signal处理僵尸进程
  5. php session redis db,php session redis 配置
  6. uos配置 java 环境变量_CentOS 7.3 环境配置java和tomcat开机启动
  7. python增量赋值是什么意思_关于python中的增量赋值的理解
  8. mysql windows 安装 错误
  9. 软件开发高手须掌握的4大SQL精髓语句(综合篇)
  10. android获取sd卡mount,Android如何获取所有存储卡挂载路径
  11. golang在windows下编译Linux下的文件
  12. 浅谈Java两种并发类型——计算密集型与IO密集型
  13. 数据分析实践——如何搭建数据指标体系(抖音为例)
  14. sqlmap用法详解
  15. windows操作系统---1
  16. java 计算经度纬度之间的距离
  17. DC的逻辑综合与优化
  18. 解决win10下samba不能访问
  19. 并行计算————计算机架构
  20. 真正的自由是节制欲望自律简朴地去生活

热门文章

  1. django得到Model的全部字段名(field)
  2. Ubuntu/Centos 等linux终端忽略大小写提示
  3. 此上下文中不允许函数定义。_彻底搞懂上下文this,轻松应对,一面就过!!!...
  4. java table 设置长度_Java字节码lookupswitch和tableswitch总指令长度
  5. GEETEST极验召集互联网大佬齐聚光谷,共同探讨交互安全问题
  6. 构建之法首周阅读体会
  7. 构建之法----软件工程简介
  8. 一个图文混排问题的解决过程
  9. Linux 系统之Sysvinit
  10. jquery 获取当前元素的索引值