一、隐式共享
隐式数据共享机制去最大化资源有效利用和最小化复制克隆操作。隐式共享类当作为函数参数传递的时候,不仅安全而且效率很高,因为传递的时候只是传递的数据的指针,数据本身只当自己被修改的时候才会去复制。简称写时复制。数据相同时,执行浅拷贝,仅复制指向数据块的指针,数据不同时则执行深拷贝。隐式共享技术可以大大降低对内存的开销及CPU资源的消耗,很大程度提高应用程序的运行效率。
QString类采用16位的Unicode值(两字节)保存数据,Unicode把所有语言都统一到一套编码里,Unicode提供UTF-8、UTF-16、UTF-32编码方式。UTF-8以字节为单位对Unicode进行编码,对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。
二、QString的构造与转化
2.1QString的构造方法
//构造
QString s0="Hello";
//拷贝构造
QString s1=s0;
//const char*构造
QString s2("Hello");
//QChar 数组初始化
QChar cHello[5]={'H','e','l','l','o'};
QString s3(cHello,5);//第二个参数表示数组长度
2.2QString的转化方法
QString转数值
QString 转int float double,调用toInt( )、toFloat( )、toDouble( ) 方法,方法第一个参数用来接收是否转化成功,toInt( )方法可以传入第二个参数表示转化成整数的进度(默认十进制)
QString strAge="10";
int iAge = strAge.toInt();
float fAge = strAge.toFloat();
double dAge = strAge.toDouble();
数值转QString
number( ) 和setNum( )方法都可以将数字转字符串。不同的是number( ) 方法不会改变调用字符串本身的值,只会返回转化的结果;setNum( )方法不仅会返回转化的结果,还会改变调用字符串的值
int year=999;
QString strYear;
strYear = strYear.number(year);
float height = 180.5f;
QString strWidth;
strWidth.setNum(height);
qDebug()<<"strYear: "<<strYear<<endl<<"strWidth:"<<strWidth;
QString转QByteArray
QByteArray是字节数组,QString只需调用toUtf8( )方法即可,toUtf8( )方法会返回一个QByteArray类型
QString strTom = "Tom";
QByteArray tomArray = strTom.toUtf8();//指定编码格式,返回QByteArray类型
QString 与 const char*互转
const char*转QString 只需按照构造方法传入即可;而QString 转const char*需要先转成QByteArray类型,QByteArray继续调用data( )方法。
//const char*转QString
const char* cs="Tom";
QString strTom(cs);
//QString 转 const char*
QString strJerry="Jerry";
QByteArray jerryArray = strJerry.toUtf8();
const char* cJerry = jerryArray.data();
QString 与 日期互转
调用QDate::fromString()方法,可以将传入的字符串转为日期,第一个参数表示要转换的字符串,第二个参数表示日期格式
//QString转日期
QString strTime = "2022-12-12 21:00:00";
QDateTime dtTime=QDateTime::fromString(strTime,"yyyy-MM-dd hh:mm:ss");
qDebug()<<"QString 转日期:"<<dtTime;
//日期转QString
QDateTime dtCurrent = QDateTime::currentDateTime();//获取当前日期
QString strCurrent = dtCurrent.toString("yy年MM月dd日 hh时mm分ss秒");
qDebug()<<"日期转QString:"<<strCurrent;
三、QString其他常用方法
3.1 QString拼接
QString可以直接用“+”号拼接字符串,也可也使用“+=”符
QString str = "Hello";
str = str + "World";
str+="!!";
qDebug()<<"str: "<<str;
3.2 QString格式化
使用sprintf( )函数
QString sYear;
sYear.sprintf("%s%d%s%.1f%s","今年是",2022,"年 ",80.1,"亿人");
qDebug()<<"sYear:"<<sYear;
使用arg( )函数
QString sYear;
sYear= QString("%1%2%3%4").arg("今年是").arg(2020).arg("年 ").arg(80.1).arg("亿人");
qDebug()<<"sYear:"<<sYear;
3.3 索引字符
使用at( )方法,可以索引字符串的字符,索引从0位置开始,返回QChar类型
QString sAnimal = "cat";
qDebug()<<"sAnimal第2个位置字符为:"<<sAnimal.at(2);
3.4 插入与替换字符
使用insert( )方法可以向字符串中插入数据,insert方法第一个参数表示插入的位置,第二个参数表示插入的字符串(是一个QByteArray类型)
QString sFish="鱼的记忆是:";
qDebug()<<"插入前sFish:"<<sFish;
QString sMem="三秒钟";
//插入数据
sFish.insert(5,sMem.toUtf8());
qDebug()<<"插入后sFish:"<<sFish;
prepend( )方法可以在起始位置插入数据
sFish.prepend("热带");
qDebug()<<"起始位置插入数据sFish:"<<sFish;
replace( )方法可以替换字符串,第一个参数表示替换的起始位置,第二个参数表示替换几个字符,第三个参数表示要替换的字符串。
sFish.replace(7,3,"三个月");
qDebug()<<"sFihs:"<<sFish;
3.5 去除空格
trimmed( )方法可以去除字符串两端的空格,trimmed( )不会改变调用字符串的值
QString strAnimal = " Tom and Jerry ";
qDebug()<<"空格去除前:"<<strAnimal;
strAnimal = strAnimal.trimmed();//不改变原来调字符串的值
qDebug()<<"空格去除后:"<<strAnimal;
simplified( )方法可以去除两端和中间的空格,但是会将中间的空格替换成一个空格
strAnimal = " 他们 是 好朋友: "+strAnimal +" !! ";
qDebug()<<"空格去除前:"<<strAnimal;
strAnimal = strAnimal.simplified();
qDebug()<<"空格去除后:"<<strAnimal;
3.6 检测字符串
startsWich(str)方法 检测是字符串是否以str为开头
endsWich(str)方法 检测字符串是否以str为结尾
contains(str)方法 检测字符串是否包含str
上面的检测方法可以传入第二个参数,表示检测时是否考虑大小写,Qt::CaseSensitive表示对大小写敏感(默认值),Qt::CaseInsensitive表示对大小写不敏感
QString sTom = "Tom and Jerry";
qDebug()<<sTom.startsWith("T");
qDebug()<<sTom.startsWith("t",Qt::CaseInsensitive);
qDebug()<<sTom.endsWith("jERrY",Qt::CaseInsensitive);
3.7 字符串比较
compare( )方法可以进行字符串比较,返回第一个不相等字符的前一个ASCII码减后一个ASCII码的值,返回0表示字符串相等。也可以传入第二个参数表示对大小写是否敏感。
qDebug()<<QString::compare("Tom","tOM",Qt::CaseInsensitive);
qDebug()<<QString::compare("Tom","TOM");//默认大小写敏感
3.8 字符串分割与截取
split( )方法可以进行字符串分割,返回QStringList类型。
QString strTime="1949/10/1";
QStringList timeList=strTime.split("/");
foreach (QString ss, timeList) {
qDebug()<<ss<<endl;
}
mid( )方法可以截取字符串,第一个参数表示开始截取的位置,第二个参数表示截取的字符数(默认到字符串末尾-1)。
QString sFrinds = "Tom and Jerry";
qDebug()<<sFrinds.mid(0,3);
3.9 NULL字符串与空字符串比较。
空字符串表示没有字符,而只有当调用默认构造函数或者用const char* 0 初始化时才是空字符串。
qDebug()<<"采用默认构造函数:";
qDebug()<<QString().isNull();//true
qDebug()<<QString().isEmpty();//true
qDebug()<<"采用空字符串:";
qDebug()<<QString("").isNull();//false
qDebug()<<QString("").isEmpty();//true
qDebug()<<"采用(const char*)0:";
const char*cc='\0';//单引号!!!
qDebug()<<QString(cc).isNull();//true
qDebug()<<QString(cc).isEmpty();//true