一.与c++String的区别
c++字符串的每个字符,占一个字节
但是QString每个字符占两个字节。
这样就完美解决了汉字占两个字节的问题。
内存变大了,自然好处少不了
隐式共享就是再此基础上完成的
二.隐式共享
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); QString str1="姚国林"; QString str2=str1;//拷贝构造函数,默认浅拷贝 qDebug()<<str1; qDebug()<<str2; str2[2]='A';//深拷贝,不然str1的值也会被改变 qDebug()<<str1; qDebug()<<str2; str1=str2;//str1又指向str2,str1的内存自动销毁 qDebug()<<str1; qDebug()<<str2; } MainWindow::~MainWindow() { delete ui; }
运行结果:
想必大家对结果并不意外,最要是内部的实现机制,你知道嘛?不慌下面给大家画一个图!
QString会多一个用来记录指针指向的计数器
当我们用str1初始化str2时,会做一个浅拷贝,学过c++的应该都知道,就是指针也指向同一块内存。
对srt2的值进行修改,如果是浅拷贝,则str1也会被修改,此时,str2会做一个深拷贝,重新开辟一块内存。
如果现在又让str2赋值给str1,则str2的计数器为2,str1的计数器为0,就会自动销毁这一块内存。
所以说QString这种隐式共享也被称之为写时复制,会大大的节省开销,如果一样就指向同一块内存,如果不一样,就马上开辟一块内存。
三.初始化
可以用=,或者()来进行初始化
运行结果:
四.判断是否为空串
关键字:isEmpty()
运行结果:
值得注意的是 “” 是空串,但是 " " 不是空串!
五.字符串的长度
三个接口:size(),count(),size()
运行结果:
六.添加字符串
1.尾加
对字符串进行+=即可
运行结果:
还可以append()
运行结果:
哈哈你们是大帅哥吗?是的话,评论一个是!
2.任意位置加
用insert()
运行结果:
我真滴服了,我明明是大帅哥。
运行结果:
当添加的位置大于原来字符串时,中间会自动补空格。
七.替换字符串
用replace()
运行结果:
默认是区分大小写的!可以加一个Qt::CaseInsensitive不区分大小写替换
运行结果:
八.修改字符串
直接可以用下标进行修改
运行结果:
【qt】QString字符串2:https://developer.aliyun.com/article/1507177?spm=a2c6h.13148508.setting.21.1da44f0eRYiaPa