1. 历史遗留问题和解决方案

(1)历史遗留问题

  ①C语言不支持真正意义上的字符串

  ②C语言用字符数组和一组函数实现字符串操作

  ③C语言不支持自定义类型,因此无法获得字符串类型

(2)解决方案

  ①从C到C++的进化过程中引入了自定义类型

  ②在C++中可以通过类完成字符串类型的定义

2. 标准库STL

(1)STL库

  ①STL是意义上需要与C++一同发布的标准库

  ②STL是一套以模板技术完成的C++类库

  ③STL中包含了常用的算法和数据结构

  ④STL中包含了字符串类

(2)Qt VS STL

  ①STL的具体实现依赖于编译器生产厂商

  ②STL的“标准”只是其接口是标准的(即相同的全局函数、相同的算法类和数据结构、相同的类成员函数)

  ②不同厂商的编译器所带的STL,其实现存在差异(依赖于STL开发的C++程序在不同平台上的行为可能出现差异!!!)

(3)开发前的选择

  ①项目是否需要使用现有库的支持?(STL、Qt、MFC、私有库?)

  ②项目是否需要在不同平台间移植?(Linux、Windows、Andriod?)

  ③项目是否需要图形用户界面?(GUI、命令行、后台服务程序?)

3. Qt中的字符串类

(1)特点

  ①采用Unicode编码

  ②使用隐式共享技术(Copy On Write)来节省内存和不必要的数据拷贝

  ③跨平台使用,不必考虑字符串的平台兼容性

(2)QString VS string

  ①QString直接支持字符串和数字的相互转换

  ②QString直接支持字符串的大小比较

  ③QString直接支持字符编码间的相互转换

  ④QString直接支持std::string和std::wstring的相互转换

  ⑤QString直接支持正则表达式的应用

  ⑥……

【实例分析】QString基本操作示例

#include <QApplication>
#include <QDebug>
#include <QString> void Sample_1()
{
QString s = "and"; s.append(" "); //"and "
s.append("Qt"); //"and Qt"
s.prepend(" "); //" and Qt"
s.prepend("C++");//"C++ and Qt" qDebug() << s; s.replace("and", "&"); //"C++ & Qt" qDebug() << s;
} void Sample_2()
{
QString s = "";
int index = ; s.sprintf("%d. I'm %s, thank you!", , "SantaClaus"); //"1. I'm SantaClaus, thank you!"
qDebug() << s; index = s.indexOf(",");
//从索引0到index之间的字符子串
s = s.mid(, index); //"1. I'm SantaClaus"
qDebug() << s; index = s.indexOf(".");
s = s.mid(index + ,s.length()); //" I'm SantaClaus";
s = s.trimmed(); //"I'm SantaClaus";
qDebug() << s; index = s.indexOf(" ");
s = s.mid(index + , s.length()); //"SantaClaus" qDebug() << s;
} void Sample_3(QString* a, int len)
{
for(int i=;i<len;i++)
{
for(int j=i+; j<len; j++)
{
if( a[j] < a[i])
{
QString tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
} int main(int,char**)
{
qDebug() << "Sample_1:";
Sample_1();
qDebug() << endl; qDebug() << "Sample_2:";
Sample_2();
qDebug() << endl; qDebug() << "Sample_3:";
QString company[] =
{
QString("Oracle"),
QString("Borland"),
QString("Microsoft"),
QString("IBM"),
QString("Horizon Studio")
}; Sample_3(company, ); for(int i=; i<; i++)
{
qDebug() << company[i];
} return ;
}

(3)Qt中的QString

  ①QString在Qt库中几乎是无所不在

  ②所有的Qt图形用户组件都依赖于QString

【编程实验】为计算器实例添加消息响应

//QCalculatorUI.h

#ifndef _QCALCULATORUI_H_
#define _QCALCULATORUI_H_ #include <QWidget>
#include <QLineEdit>
#include <QPushButton> class QCalculatorUI : public QWidget
{
//要自定义信号和槽,必须在最开始的这里添加Q_OBJECT
Q_OBJECT
private:
QLineEdit* m_edit;
QPushButton* m_buttons[]; //二阶构造法:当new一个QLineEdit和一些按钮时可能会失败,所以采用二阶构造
QCalculatorUI(); //第1阶——先隐藏构造函数
bool construct();//第2阶 private slots: //声明槽时得加slots
void onButtonClicked(); public:
static QCalculatorUI* NewInstance();
void show();
~QCalculatorUI();
}; #endif //_QCALCULATORUI_H_

//QCalculatorUI.cpp

#include "QCalculatorUI.h"
#include <QDebug> QCalculatorUI::QCalculatorUI(): QWidget(NULL, Qt::WindowCloseButtonHint)
{ } bool QCalculatorUI::construct()
{
bool ret = true; const char* btnText[] =
{
"", "", "", "+", "(",
"", "", "", "-", ")",
"", "", "", "*", "←",
"", ".", "=", "/", "C",
}; m_edit = new QLineEdit(this);//le的生命期由父组件来管理
if( m_edit != NULL)
{
m_edit->move(, );
m_edit->resize(, );
m_edit->setReadOnly(true); //设置编辑框的只读属性
}
else
{
ret = false;
return ret;
} for(int i = ; (i < ) && ret; i++)
{
for(int j = ; (j< ) && ret; j++)
{ m_buttons[i * + j] = new QPushButton(this);//按钮的生命期由父组件来管理
if (m_buttons[i * + j] != NULL)
{
m_buttons[i * + j]->resize(, );
m_buttons[i * + j]->move( + j * , + i * );
m_buttons[i * + j]->setText(btnText[i * + j]); //消息映射
//1.消息名(信号)要加SIGNAL关键字,消息处理函数(槽):用SLOT关键字
//2.信号和槽的函数签名必须一致,即都是无参的函数,返回值void
connect(m_buttons[i*+j], SIGNAL(clicked()), this, SLOT(onButtonClicked()));
}
else
{
ret = false;
}
}
} return ret;
} QCalculatorUI* QCalculatorUI::NewInstance()
{
QCalculatorUI* ret = new QCalculatorUI(); if((ret == NULL) || !ret->construct())
{
delete ret;//删除半成品
ret = NULL;
} return ret;
} void QCalculatorUI::show()
{
QWidget::show();
setFixedSize(width(), height());
} void QCalculatorUI::onButtonClicked()
{
//sender是QObject类的,用于表示消息的发送者
QPushButton* btn = (QPushButton*)sender();
QString clickText = btn->text(); if(clickText == "←")
{
QString text = m_edit->text();
if(text.length() > )
{
text.remove(text.length()-, );
m_edit->setText(text);
}
}else if( clickText == "C")
{
m_edit->setText(""); }else if( clickText == "=")
{ }
else
{
m_edit->setText(m_edit->text() + clickText);
}
} QCalculatorUI::~QCalculatorUI()
{ }

//main.cpp

#include <QApplication>
#include "QCalculatorUI.h" int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QCalculatorUI* cal = QCalculatorUI::NewInstance();
int ret = -; if(cal != NULL)
{
cal->show();
ret = a.exec(); delete cal;
} return ret;
}

4. 小结

(1)应用开发中大多数的情况都在进行字符串处理

(2)Qt比STL更适合于跨平台开发的场景

(3)Qt中的QString比STL中的string更强大易用

(4)Qt图形用户组件都依赖于QString

(5)项目开发时需要综合各种因素,选择需要使用的库

第11课 Qt中的字符串类的更多相关文章

  1. 第33课 C++中的字符串类

    在C语言中学习字符串时,我们使用的是字符数组的概念. C语言中没有真正意义的字符串.为了表达字符串的概念,我们使用了字符数组来模拟字符串. 在应用程序开发中,我们需要大量的处理字符串,如果还用C语言中 ...

  2. Qt学习之路(2)------Qt中的字符串类

    QString QString的一些基本用法 basic.cpp #include <QTextStream> int main(void) { QTextStream out(stdou ...

  3. Qt 中QString 字符串操作:连接、组合、替换、去掉空白字符

    Qt中的字符串类 QString类 保存了16位Unicode值,提供了丰富的操作.查询和转换等函数. QString 字符串有如下几个操作符: (1) "+" 用于组合两个字符串 ...

  4. Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:

    Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...

  5. C++中的字符串类

    1,本文分析 C++ 中的字符串,C 语言中的字符串利用的是 C 语言中的字符数组,  在 C 语言中没有真正意义上的字符串,利用了字符数组表示了字符串,最初设  计 C 语言仅仅是为了开发 Unix ...

  6. Qt 中一些常用类中文说明

    Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进 ...

  7. 第 33课 C++中的字符串(上)

    历史的遗留问题在C语言中没有真正意义上的字符串,为了表达字符串这个概念利用字符数组来模拟字符串.C语言不支持真正意义上的字符串 (C++也不支持)C语言用字符数组和一组函数实现字符串操作 (C++中同 ...

  8. 第33课 C++中的字符串

    1. 历史遗留问题及解决方案 (1)历史遗留问题 ①C语言不支持真正意义上的字符串------c语言是用字符数组实现字符串 ②C语言用字符数组和一组函数模拟字符串操作 ③C语言不支持自定义类型,因此无 ...

  9. QT中的字符串处理函数

    Fn 1 : arg 这个函数的具体声明不写了,它有20个重载,典型的示例代码如下: 1: #include <QtCore/QCoreApplication> 2: #include & ...

随机推荐

  1. 理解if __name__ == '__main__':

    一开始没怎么注意这个语句,这两天在模拟知乎登陆时准备刨根问底了,先看两行代码片段 第一个例子:这是在login.py文件的一部分,其他我们忽略,只关注print()函数的内容 import time ...

  2. BZOJ 2226 【SPOJ 5971】 LCMSum

    题目链接:LCMSum 这个题显然就是要我们推式子了……那么就来推一波: \begin{aligned}&\sum_{i=1}^n lcm(i,n) \\=&\sum_{i=1}^n\ ...

  3. shell 输入不显示在监视器上

    #!/bin/bash read -s -p "Enter your password:" pass echo "your password is $pass" ...

  4. [原][osgearth]设置OE的高程,高度场的数据。修改设置高度值

    ; row < hf->getNumRows(); ++row ) { ; col < hf->getNumColumns(); ++col ) { float val = h ...

  5. oracle版本号详解

  6. Android下移植tcpflow

    tcpflow是linux平台下的开源抓包工具,它能监听网络url,获取http请求的各种数据.tcpflow可以说是tcpdump的简约版.要想将tcpflow移植到Android平台中,就需要通过 ...

  7. 【Python】重载模块

    命令窗口中调试代码,往往需要重载模块已进行最新的代码调试. 主要有两种方式: 1. Python shell 窗口 reload(module) 2. ipython 窗口 %load_ext aut ...

  8. 移动web开发适配方案之Rem

    移动端为什么要做适配 移动端相对PC端来说大部分浏览器内核都是基于Webkit的,所以大部分都支持CSS3的最新语法.但是由于手机的屏幕尺寸和分辨率都不太一样(尤其是安卓),所以不得不对不同分辨率的手 ...

  9. [ccf 4] 网络延时

    网络延时 问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机.交换机与电脑之间使用网络连接.交换机按层级设置,编号为1的交换机为根交换机,层级为      1.他的交换机都连 ...

  10. 作业要求20181023-4 Alpha阶段第2周/共2周 Scrum立会报告+燃尽图 02

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284] 版本控制:https://git.coding.net/liuyy08 ...