QT5开发及实例学习之三字符串类


前言

标准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)的步长增长。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值