QString

这篇博客探讨了Qt库中的QString类如何实现隐式共享机制,通过讲解字符串的隐式共享,强调了在传递和复制过程中的高效性和安全性。此外,还介绍了QString的常用初始化方法和转换方式,以及其在Unicode编码下的特性,特别是与UTF-8的兼容性。

QString隐式共享

  • 隐式共享:隐式数据共享机制去最大化资源有效利用和最小化复制克隆操作。隐式共享类当作为函数参数传递的时候,不仅安全而且效率很高,因为传递的时候只是传递的数据的指针,数据本身只当自己被修改的时候才会去复制。简称写时复制。数据相同时,执行浅拷贝,仅复制指向数据块的指针,数据不同时则执行深拷贝。隐式共享技术可以大大降低对内存的开销及CPU资源的消耗,很大程度提高应用程序的运行效率。
  • QString类保存了16位的Unicode值,Unicode把所有语言都统一到一套编码里,Unicode提供UTF-8、UTF-16、UTF-32编码方式。UTF-8以字节为单位对Unicode进行编码,对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。

QString s1 = s0;处设置断点后调试运行

断点调试快捷键 功能
F9 设置/取消断点
F5 开始调试/调到下一个断点
F10 单步
F11 单步进入
Shift + F11 单步跳出
Ctrl + F10 调到指定行
Shift + F5 结束断点调试
	QString s0 = "Hello";   //数据块"Hello"引用计数为1
    QString s1 = s0;        //数据块"Hello"引用计数为2
    QString s2 = s0;        //数据块"Hello"引用计数为3

    //数据块"Hi"引用计数为1, 数据块"Hello"引用计数变为2
    s2 = "Hi";

    QString s3 = s0;    //数据块"Hello"引用计数为3
    QString s4 = s2;    //数据块"Hi"引用计数为2
    QString s5 = s2;    //数据块"Hi"引用计数为3

 
 

QString常用初始化 和 转换方式:

//常用初始化方式
    QString str("张三");
    QChar cHello[5] = {
   
   'H','e','l','l','o'};
    QString Hello(cHello, sizeof(cHello)/sizeof(cHello[0]));
    qDebug() << str << Hello;

    //QString 转换 int float double类型
    QString strAge = "2022";
    QString strPI = "3.14";
    int age = strAge.toInt();       //转换int类型
    float fPI = strPI.toFloat();    //转换float类型
    double dPI = strPI.toDouble();  //转换double类型
    
### QString 的用法与示例 QStringQt 框架中用于处理字符串的核心类,提供了丰富的功能来操作和管理字符串。以下是 QString 的一些常见用法及示例代码。 #### 1. 创建 QString 对象 可以通过多种方式创建 QString 对象,例如使用字面量、构造函数或通过其他 QString 初始化。 ```cpp QString str1 = "Hello, World!"; // 使用字面量创建 QString str2("Qt is awesome."); // 使用构造函数创建 QString str3 = QString("Number: %1").arg(42); // 动态格式化字符串[^1] ``` #### 2. 字符串拼接 QString 支持使用 `+` 或 `append()` 方法进行字符串拼接。 ```cpp QString str4 = str1 + " " + str2; // 使用 + 拼接 str4.append(" More text."); // 使用 append() 方法 ``` #### 3. 子串提取 可以使用 `mid()` 方法从字符串中提取子串。 ```cpp QString x = "Nine pineapples"; QString y = x.mid(5, 4); // 提取从索引 5 开始的 4 个字符,y == "pine"[^3] QString z = x.mid(5); // 提取从索引 5 开始的所有字符,z == "pineapples"[^3] ``` #### 4. 字符串替换 使用 `replace()` 方法可以替换字符串中的特定部分。 ```cpp QString original = "Hello, World!"; QString replaced = original.replace("World", "Qt"); // replaced == "Hello, Qt!" ``` #### 5. 字符串分割 可以使用 `split()` 方法将字符串按指定分隔符分割为 QStringList。 ```cpp QString listStr = "one,two,three"; QStringList list = listStr.split(","); // list == ["one", "two", "three"] ``` #### 6. 字符串比较 QString 提供了多种方法来比较字符串,例如 `compare()` 和 `startsWith()`。 ```cpp bool isEqual = QString("hello").compare("Hello", Qt::CaseInsensitive) == 0; // 忽略大小写的比较 bool startsWithH = QString("hello").startsWith("h"); // 判断是否以 'h' 开头 ``` #### 7. 转换为其他类型 QString 可以轻松转换为其他数据类型,例如整数或浮点数。 ```cpp QString numStr = "123"; int num = numStr.toInt(); // 转换为整数 double dbl = numStr.toDouble(); // 转换为浮点数 ``` #### 8. 动态格式化字符串 使用 `arg()` 方法可以动态格式化字符串,类似于 C 中的 `sprintf`。 ```cpp QString formatted = QString("Name: %1, Age: %2").arg("Alice").arg(30); // formatted == "Name: Alice, Age: 30" ``` #### 9. QStringList 的使用 QStringList 是一个专门用于存储 QString 的容器类,支持多种初始化和操作方式。 ```cpp QStringList list; list << "one" << "two" << "three"; // 使用 << 添加元素 QStringList copyList = QStringList() << "four" << "five"; // 直接初始化 ``` ### 常见问题解答 1. **如何判断 QString 是否为空?** 使用 `isEmpty()` 方法可以判断 QString 是否为空。 ```cpp bool isEmpty = QString().isEmpty(); // true ``` 2. **如何将 QStringList 转换为单个字符串?** 使用 `join()` 方法可以将 QStringList 转换为单个字符串。 ```cpp QStringList list = {"one", "two", "three"}; QString joined = list.join(", "); // joined == "one, two, three" ``` 3. **如何移除 QString 中的空格?** 使用 `remove()` 方法可以移除 QString 中的空格。 ```cpp QString str = " Hello World "; str.remove(QChar(' ')); // str == "HelloWorld" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值