QByteArray类的介绍
- 格式:docx
- 大小:13.27 KB
- 文档页数:2
QByteArray是Qt框架中用于存储二进制数据的类。
在实际开发中,经常会用到QByteArray的拷贝构造函数,用于将一个QByteArray对象的内容拷贝到另一个QByteArray对象中。
拷贝构造函数是C++中的一个重要概念,在Qt框架中也有着重要的应用。
本文将重点探讨QByteArray类中的拷贝构造函数,包括其定义、使用方法以及相关注意事项。
一、QByteArray的拷贝构造函数定义QByteArray的拷贝构造函数是用来创建一个新的QByteArray对象,并将另一个QByteArray对象的内容拷贝到新对象中。
其定义如下:```cppQByteArray::QByteArray(const QByteArray other)```从定义可以看出,拷贝构造函数的参数是一个const类型的QByteArray引用。
这说明在调用拷贝构造函数时,被拷贝的QByteArray对象是不会被改变的,这是因为参数被声明为const类型。
拷贝构造函数创建的新对象将会包含与被拷贝对象完全相同的数据。
二、QByteArray的拷贝构造函数使用方法要使用QByteArray的拷贝构造函数,只需要在创建新的QByteArray 对象时,将另一个QByteArray对象作为参数传入即可。
例如:```cppQByteArray data("Hello, World!");QByteArray copyData(data); // 调用拷贝构造函数,将data拷贝给copyData```在上面的代码中,我们首先创建了一个QByteArray对象data并初始化为"Hello, World!",然后通过拷贝构造函数将data拷贝给了copyData。
此时,copyData中的内容也变成了"Hello, World!",与data完全相同。
拷贝构造函数还可以在对象初始化列表中使用,例如:```cppclass MyClass {public:MyClass(const QByteArray data) : m_data(data) {} private:QByteArray m_data;};```在上面的代码中,我们定义了一个类MyClass,其构造函数使用了QByteArray的拷贝构造函数,将参数data拷贝给了成员变量m_data。
qbytearray 存储结构体原理-回复QByteArray存储结构体原理:深入解析在C++编程中,结构体是一种用户自定义的数据类型,用于将不同类型的数据组织在一起。
而QByteArray是Qt框架中的一个类,用于存储和处理字节数组。
在本篇文章中,我将详细讨论QByteArray存储结构体的原理,以及如何使用该特性进行数据的存储和访问。
1. 结构体和QByteArray的简介结构体是一种聚合数据类型,可以将不同类型的数据组织在一起,形成一个结构。
它的定义通常包括数据成员和成员函数。
相比于其他数据类型,结构体具有更好的可读性和可维护性。
而QByteArray是Qt框架提供的一个类,用于存储字节数组数据。
它提供了一系列的成员函数,可以方便地进行字节数据的处理和操作。
2. 结构体的定义和使用方法结构体的定义使用关键字struct,后跟结构体名。
在定义结构体时,可以通过成员变量来描述不同类型的数据。
例如,我们可以定义一个保存学生信息的结构体:struct Student {int id;QString name;int age;};在使用结构体时,可以通过结构体名和成员名来访问和修改结构体的数据。
例如,我们可以创建一个Student结构体的实例,并给其成员赋值:Student student;student.id = 1001; = "Tom";student.age = 18;可以通过点操作符(.)来访问结构体的成员变量。
例如,可以打印学生的姓名:qDebug() << ;3. QByteArray的特性和数据存储方式QByteArray是Qt框架中专门用于存储字节数组的类。
它提供了一系列的成员函数,用于处理和操作字节数组数据。
QByteArray内部使用指针来指向分配的内存块,同时还保存了字节数组的长度。
通过调用QByteArray类的构造函数,可以创建一个QByteArray实例。
QByteArray通过QDataStream的读写//先上测试代码:#include <QDataStream>#include <QByteArray>#include <QFile>int main(){QByteArray dstByteArray;QString strRead;QDataStream writeToByteArray(&dstByteArray, QIODevice::ReadWrite);QFile fConsol;// 打开控制台输出fConsol.open(stdout, QIODevice::WriteOnly);QTextStream writeTextConsol(&fConsol);// 向dstByteArray中写入一个字符串writeToByteArray << QString("test");// 然后再从里面读出来writeToByteArray >> strRead ;// 显示刚刚的读取结果writeTextConsol << strRead;return 0;}我期望的结果当然是把刚写入的字符串 "test" 读出来然后再显示到控制台上,但是结果却意外:如图,结果什么也没有,为什么呢?????查下qt的文档,看了QDataStream的构造函数介绍: QDataStream::QDataStream( QByteArray * a, QIODevice::OpenMode mode )Constructs a data stream that operates on a byte array, a. The mode describes how the device is to be used. Alternatively, you canuse QDataStream(const QByteArray &) if you just want to read from a byte array.Since QByteArray is not a QIODevice subclass, internally a QBuffer is created to wrap the byte array.从可以看出因为QByteArray不是一个继承自QIODevice的类所以QDataStream类在处理它的时候会创建一个QBuffer类.而QBuffer是继承自QIODevice类的,而QIODevice类在处理数据的时候都有一个文件指针,指向当前处理的位置.当使用writeToByteArray << QString("test");向一个QByteArray中写入一个字符串后,就像对文件的写入一样,文件的指针会向后移动,指向下一个位置,当使用:writeToByteArray >> strRead ;再从QByteArray中读入时,因为此时文件的指针指在最后面,读的时候就会发现后面没有数据了,所以就会返回一个空字符串,于是输出什么也没有了.即然知道原因了就好办了,只要在读取之前重新设置一下文件指针就可以了,下面是代码:// 省略相同的............// 向dstByteArray中写入一个字符串writeToByteArray << QString("test");//-------------------------------------------------------------// 设置文件指针 // 这里是新加的writeToByteArray.device()->seek(0);//-----------------------------------------------------------------// 然后再从里面读出来writeToByteArray >> strRead ;// 省略相同的...........结果:可以看到显示和预想的一样了.对于用QDataStream向一个ByteArray中写入的数据,可不可以直接输出呢如下:writeTextConsol << dstByteArray.data();因为data()会返回QByteArray中数据的指针。
QByteArray使⽤⽅法⼤全QByteArray在Qt中QByteArray可以看做是c语⾔中 char*的升级版本。
我们在使⽤这种类型的时候可通过这个类的构造函数申请⼀块动态内存,⽤于存储我们需要处理的字符串数据。
下⾯给⼤家介绍⼀下这个类中常⽤的⼀些API函数,⼤家要养成遇到问题主动查询帮助⽂档的好习惯构造函数// 构造空对象, ⾥边没有数据QByteArray::QByteArray();// 将data中的size个字符进⾏构造, 得到⼀个字节数组对象// 如果 size==-1 函数内部⾃动计算字符串长度, 计算⽅式为: strlen(data)QByteArray::QByteArray(const char *data, int size = -1);// 构造⼀个长度为size个字节, 并且每个字节值都为ch的字节数组QByteArray::QByteArray(int size, char ch);数据操作// 在尾部追加数据// 其他重载的同名函数可参考Qt帮助⽂档, 此处略QByteArray &QByteArray::append(const QByteArray &ba);void QByteArray::push_back(const QByteArray &other);// 头部添加数据// 其他重载的同名函数可参考Qt帮助⽂档, 此处略QByteArray &QByteArray::prepend(const QByteArray &ba);void QByteArray::push_front(const QByteArray &other);// 插⼊数据, 将ba插⼊到数组第 i 个字节的位置(从0开始)// 其他重载的同名函数可参考Qt帮助⽂档, 此处略QByteArray &QByteArray::insert(int i, const QByteArray &ba);// 删除数据// 从⼤字符串中删除len个字符, 从第pos个字符的位置开始删除QByteArray &QByteArray::remove(int pos, int len);// 从字符数组的尾部删除 n 个字节void QByteArray::chop(int n);// 从字节数组的 pos 位置将数组截断 (前边部分留下, 后边部分被删除)void QByteArray::truncate(int pos);// 将对象中的数据清空, 使其为nullvoid QByteArray::clear();// 字符串替换// 将字节数组中的⼦字符串 before 替换为 after// 其他重载的同名函数可参考Qt帮助⽂档, 此处略QByteArray &QByteArray::replace(const QByteArray &before, const QByteArray &after);⼦字符串查找和判断// 判断字节数组中是否包含⼦字符串 ba, 包含返回true, 否则返回falsebool QByteArray::contains(const QByteArray &ba) const;bool QByteArray::contains(const char *ba) const;// 判断字节数组中是否包含⼦字符 ch, 包含返回true, 否则返回falsebool QByteArray::contains(char ch) const;// 判断字节数组是否以字符串 ba 开始, 是返回true, 不是返回falsebool QByteArray::startsWith(const QByteArray &ba) const;bool QByteArray::startsWith(const char *ba) const;// 判断字节数组是否以字符 ch 开始, 是返回true, 不是返回falsebool QByteArray::startsWith(char ch) const;// 判断字节数组是否以字符串 ba 结尾, 是返回true, 不是返回falsebool QByteArray::endsWith(const QByteArray &ba) const;bool QByteArray::endsWith(const char *ba) const;// 判断字节数组是否以字符 ch 结尾, 是返回true, 不是返回falsebool QByteArray::endsWith(char ch) const;遍历// 使⽤迭代器iterator QByteArray::begin();iterator QByteArray::end();// 使⽤数组的⽅式进⾏遍历// i的取值范围 0 <= i < size()char QByteArray::at(int i) const;char QByteArray::operator[](int i) const;查看字节数// 返回字节数组对象中字符的个数int QByteArray::length() const;int QByteArray::size() const;int QByteArray::count() const;// 返回字节数组对象中⼦字符串ba 出现的次数int QByteArray::count(const QByteArray &ba) const;int QByteArray::count(const char *ba) const;// 返回字节数组对象中字符串ch 出现的次数int QByteArray::count(char ch) const;类型转换// 将QByteArray类型的字符串转换为 char* 类型char *QByteArray::data();const char *QByteArray::data() const;// int, short, long, float, double -> QByteArray// 其他重载的同名函数可参考Qt帮助⽂档, 此处略QByteArray &QByteArray::setNum(int n, int base = 10);QByteArray &QByteArray::setNum(short n, int base = 10);QByteArray &QByteArray::setNum(qlonglong n, int base = 10); QByteArray &QByteArray::setNum(float n, char f = 'g', int prec = 6); QByteArray &QByteArray::setNum(double n, char f = 'g', int prec = 6); [static] QByteArray QByteArray::number(int n, int base = 10);[static] QByteArray QByteArray::number(qlonglong n, int base = 10); [static] QByteArray QByteArray::number(double n, char f = 'g', int prec = 6); // QByteArray -> int, short, long, float, doubleint QByteArray::toInt(bool *ok = Q_NULLPTR, int base = 10) const;short QByteArray::toShort(bool *ok = Q_NULLPTR, int base = 10) const; long QByteArray::toLong(bool *ok = Q_NULLPTR, int base = 10) const; float QByteArray::toFloat(bool *ok = Q_NULLPTR) const;double QByteArray::toDouble(bool *ok = Q_NULLPTR) const;// std::string -> QByteArray[static] QByteArray QByteArray::fromStdString(const std::string &str);// QByteArray -> std::stringstd::string QByteArray::toStdString() const;// 所有字符转换为⼤写QByteArray QByteArray::toUpper() const;// 所有字符转换为⼩写QByteArray QByteArray::toLower() const;。
QByteArray和QVariant在介绍QString的最后部分曾经提到了QByteArray这个类。
现在我们就首先对这个类进行介绍QByteArray具有类似与QString的API。
它也有相应的函数,比如left(), right(), mid()等。
这些函数不仅名字和QString一样,而且也具有几乎相同的功能。
QByteArray可以存储原生的二进制数据和8位编码的文本数据。
这句话怎么理解呢?我们知道,计算机内部所有的数据都是以0和1的形式存储的。
这种形式就是二进制。
比如一串0、1代码:1000,计算机并不知道它代表的是什么,这需要由上下文决定:它可以是整数8,也可以是一个ARGB的颜色(准确的说,整数8的编码并不是这么简单,但我们姑且这个理解吧)。
对于文件,即便是一个文本文件,读出时也可以按照二进制的形式读出,这就是二进制格式。
如果把这些二进制的0、1串按照编码解释成一个个字符,就是文本形式了。
因此,QByteArray实际上是原生的二进制,但是也可以当作是文本,因此拥有文本的一些操作。
但是,我们还是建议使用QString表示文本,重要的原因是,QString支持Unicode(编码)。
,QByteArray自动的保证“最后一个字节之后的那个位”是'\0'。
这就使得QByteArray可以很容易的转换成const char *,也就是上一章节中我们提到的那两个函数。
同样,作为原生二进制存储,QByteArray中间也可以存储'\0',而不必须是'\0'在最后一位。
有些情况下,我们希望把数据存储在一个变量中。
例如,我有一个数组,既希望存整数,又希望存浮点数,还希望存string。
对于Java来说,很简单,只要把这个数组声明成Object[]类型的。
这是什么意思呢?实际上,这里用到的是继承。
在Java中,int和float虽然是原生数据类型,但是它们都有分别对应一个包装类Integer和Float。
(⼗四)QFile操作,QByteArray,⽂件流操作,QTextStream,QDat。
QFile f1.readall#include "widget.h"#include "ui_widget.h"#include <QFileDialog>#include <QMessageBox>#include <QTextCodec>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);connect(ui->selectFile, &QPushButton::clicked, this, [=](){QString filename = QFileDialog::getOpenFileName(this,"open file","d:\\");if (filename.isEmpty()) {QMessageBox::warning(this,"warnnig","select file failed");return;}ui->lineEdit->setText(filename);// 创建⽂件对象// 默认读取⽂件格式:utf8QFile file(filename);//QTextCodec* codec = QTextCodec::codecForName("gbk");// 指定打开⽅式bool isOk = file.open(QFile::ReadOnly);if (!isOk) {QMessageBox::critical(this,"ERROR","file open failed");return;}// 读⽂件QByteArray array = file.readAll();// 显⽰到⽂本框//ui->textEdit->setText(codec->toUnicode(array));ui->textEdit->setText(array);// 关闭⽂件file.close();});}Widget::~Widget(){delete ui;}2.readline#include "widget.h"#include "ui_widget.h"#include <QFileDialog>#include <QMessageBox>#include <QTextCodec>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);connect(ui->selectFile, &QPushButton::clicked, this, [=](){QString filename = QFileDialog::getOpenFileName(this,"open file","d:\\");if (filename.isEmpty()) {QMessageBox::warning(this,"warnnig","select file failed");return;}ui->lineEdit->setText(filename);// 创建⽂件对象// 默认读取⽂件格式:utf8QFile file(filename);//QTextCodec* codec = QTextCodec::codecForName("gbk");// 指定打开⽅式bool isOk = file.open(QFile::ReadOnly);if (!isOk) {QMessageBox::critical(this,"ERROR","file open failed");return;}// 读⽂件QByteArray array;while(!file.atEnd()) {array += file.readLine();}// 显⽰到⽂本框//ui->textEdit->setText(codec->toUnicode(array));ui->textEdit->setText(array);// 关闭⽂件file.close();});}Widget::~Widget(){delete ui;}readlineQByteArrayQByteArray就是⼀个字节数组。
Qt:QByteArray0、说明QByteArray是存储⼆进制byte数组。
区别于QString:QByteArray中存储的全是byte,⽽QString中存储的全是16 bit Unicode码。
QString是在Qt API中从头到尾都⽤的,⽽QByteArray则⽤于以下两种情况:①存储原始⼆进制数据;②内存保护很严格的时候(也就是说,不能乱⽤空间以免冗余)。
构造QByteArray(⼀)第⼀种构造QByteArray的⽅法是,简单地把const char *传⼊构造函数参数中。
例如:QByteArray ba("Hello");本例中QByteArray的size()会返回5,不过在该Byte Array末尾还会保留⼀个额外的'\0'字符。
QByteArray会对const char *数据采取深拷贝的策略,所以处理它时不⽤考虑边际效应(即末尾的'\0')。
如果不想深拷贝,可以使⽤QByteArray::fromRawData()。
构造QByteArray(⼆)第⼆种构造⽅法是,先定义对象,再⽤resize()设置⼤⼩,再为每个byte赋值。
这种情况⽤得少,这⾥不再多说,有需要可以去官⽹查看。
访问为了访问指定位置上的byte,可以⽤类似array[ i ]的语法形式,⽤法和char[ ]相同。
也可以⽤at( i )⽅法,功能与[ ]相同,但是速度上更快,因为at()不会引起深拷贝。
为了⼀次提取多个bytes,可以⽤left()、right()、mid()⽅法。
QByteArray中的'\0'在QByteArray中可以在中间嵌⼊'\0'。
但是size()⽅法会统计整个Array的size,包括嵌⼊的'\0',但是会排除最后的结尾符'\0'。
如果想知道直到第⼀个'\0'的data长度,可以调⽤qstrlen()⽅法。
【原创版4篇】编制人员:_______________审核人员:_______________审批人员:_______________编制单位:_______________编制时间:____年___月___日序言下面是小编为大家精心编写的4篇《c++ 的 qbytearray方法使用》,希望能够帮助到大家。
下载后,可根据实际需要进行调整和使用。
(4篇)《c++ 的 qbytearray方法使用》篇1在 C++ 中,`QByteArray` 是一个用于存储字节序列的容器类,它主要用于在 Qt 应用程序中处理二进制数据。
`QByteArray` 提供了很多实用的方法,例如添加、删除、插入、提取子序列等操作。
下面是一些常见的 `QByteArray` 方法及其用法:1. 构造函数`QByteArray` 提供了多种构造函数,用于创建不同大小的空字节数组。
例如:```cppQByteArray() // 创建一个空的字节数组QByteArray(const char *str) // 创建一个包含字符串内容的字节数组 QByteArray(int size) // 创建一个指定大小的字节数组,并初始化为 0```2. 添加方法`append()` 方法用于在字节数组末尾添加数据:```cppQByteArray arr;arr.append(1); // 向字节数组末尾添加一个整数 1arr.append("hello"); // 向字节数组末尾添加一个字符串 "hello"```3. 删除方法`remove()` 方法用于从字节数组中删除指定数量的数据:```cppQByteArray arr;arr.append(1);arr.append("hello");arr.remove(0); // 删除字节数组中的第一个整数 1arr.remove(1); // 删除字节数组中的第二个字符串 "hello"```4. 插入方法`insert()` 方法用于在字节数组中插入数据:```cppQByteArray arr;arr.append(1);arr.insert(0, "hello"); // 在字节数组开头插入字符串 "hello"arr.insert(1, 2); // 在字节数组第二个位置插入整数 2```5. 提取子序列方法`mid()` 和 `left()` 方法用于提取字节数组的子序列:```cppQByteArray arr;arr.append(1);arr.append("hello");QByteArray sub = arr.mid(0, 5); // 提取字节数组的子序列,从位置 0 到5,结果为 "hello"QByteArray sub = arr.left(5); // 提取字节数组的子序列,长度为 5,结果为 "hello"```6. 容量和长度方法`capacity()` 方法用于返回字节数组的当前容量,`length()` 方法用于返回字节数组中实际存储的数据长度:```cppQByteArray arr;arr.append(1);arr.append("hello");qDebug() << arr.capacity(); // 输出字节数组的当前容量qDebug() << arr.length(); // 输出字节数组中实际存储的数据长度 ```以上就是 `QByteArray` 的一些常用方法及其用法。
qt qbytearray resize函数什么是Qt的QByteArray类?Qt的QByteArray类是一个提供了动态大小的字节数组的类。
它是一个与字符数据相关联的、可修改的缓冲区。
QByteArray类在一些常见的使用场景中尤为有用。
它可以用于存储任意数据,对于处理二进制数据、网络编程、文件IO以及其他需要动态大小缓冲区的应用程序来说,非常实用。
QByteArray类提供了许多方法来操作字节数组,比如添加、插入、替换、删除、比较、查找、填充等。
此外,它也提供了一些用于将字节数组与其他数据类型(如QString、QChar、int等)进行转换的方法。
一个常见的需要使用QByteArray的情况是在网络编程中,当需要发送或接收二进制数据时。
QByteArray的特性使得它在这方面非常具有优势。
了解了QByteArray类的基本概念,让我们现在来深入学习一下它的resize()函数。
resize()函数是QByteArray类的一个非常实用的方法。
它允许我们改变QByteArray的大小。
这个函数可以用于扩展数组的大小,也可以用于缩小数组的大小。
首先,让我们看一下resize()函数的语法:cppvoid QByteArray::resize(int size)在这个函数中,`size`参数代表了我们想要调整的字节数组的总大小。
请注意,如果`size`小于当前字节数组的大小,则resize()函数会删除超出`size`的字节。
如果`size`大于当前字节数组的大小,则resize()函数会在必要时增加必要的字节。
下面是一个示例,展示了如何使用resize()函数:cppQByteArray byteArray("Hello, World!");byteArray.resize(5);在这个示例中,我们首先创建了一个QByteArray对象`byteArray`,并初始化它为"Hello, World!"。
qbytearray 方法QByteArray是Qt框架中用于处理字节数组的类,它提供了许多方法来处理和操作字节数组。
下面我将从不同角度介绍QByteArray的方法。
1. 构造函数:QByteArray类有多个构造函数,可以接受不同类型的参数,比如const char、QByteArray、int等。
其中,fromRawData()方法可以从原始数据创建QByteArray,而fromHex()方法可以从十六进制字符串创建QByteArray。
2. 存取操作:QByteArray提供了at()方法用于访问指定索引处的字节,还有[]运算符重载可以实现类似数组的访问。
另外,data()方法可以返回指向字节数组的指针。
3. 大小和容量:size()方法用于返回字节数组的大小,而capacity()方法则返回字节数组的容量。
resize()方法可以改变字节数组的大小,而reserve()方法可以预留一定的容量,避免多次重新分配内存。
4. 修改操作:QByteArray类提供了许多方法来修改字节数组,比如append()用于在末尾添加数据,prepend()用于在开头插入数据,insert()用于在指定位置插入数据,remove()用于移除指定位置的数据,replace()用于替换指定位置的数据等。
5. 查找和比较:QByteArray提供了indexOf()和lastIndexOf()方法用于查找指定数据的位置,contains()方法用于检查是否包含指定数据。
另外,startsWith()和endsWith()方法可以用于检查字节数组的开头和结尾是否包含指定数据。
此外,还有compare()方法用于比较两个字节数组。
6. 转换:QByteArray类提供了许多方法用于字节数组和其他数据类型之间的转换,比如toBase64()和fromBase64()可以实现字节数组和Base64编码字符串之间的转换,toHex()和fromHex()可以实现字节数组和十六进制字符串之间的转换,toStdString()和fromStdString()可以实现字节数组和std::string之间的转换。
QByteArray具有类似与QString的API。
它也有相应的函数,比如left(), right(), mid()等。
这些函数不仅名字和QString一样,而且也具有几乎相同
的功能。
QByteArray可以存储原生的二进制数据和8位编码的文本数据。
这句
话怎么理解呢?我们知道,计算机内部所有的数据都是以0和1的形式存储的。
这种形式就是二进制。
比如一串0、1代码:1000,计算机并不知道它代表的是什么,这需要由上下文决定:它可以是整数8,也可以是一个ARGB的颜色(准
确的说,整数8的编码并不是这么简单,但我们姑且这个理解吧)。
对于文件,即便是一个文本文件,读出时也可以按照二进制的形式读出,这就是二进制格式。
如果把这些二进制的0、1串按照编码解释成一个个字符,就是文本形式了。
因此,QByteArray实际上是原生的二进制,但是也可以当作是文本,因此拥有
文本的一些操作。
但是,我们还是建议使用QString表示文本,重要的原因是,QString支持Unicode。
把经典的C字符串复制到QString的函数将不会复制结尾的0字符。
QString的QChar数组(可以通过 unicode()返回)通常不以零结尾。
如果你
需要把QString传递到一个需要C的以零结尾的字符串,请使用latin1()。
注意如果你发现你正在混合使用QCString、QString和QByteArray,这
将会导致很多不必要的复制并且也许会预示着你正在处理的真实自然数据是不确定的。
如果数据是以零结尾的八位数据,请使用QCString;如果它是没有结
尾的(也就是包含0)八位数据,请使用QByteArray;如果它是文本,请使用QString。
为了方便期间,QByteArray自动的保证“最后一个字节之后的那个位是''。
这就使得QByteArray可以很容易的转换成const char *,也就是上一章节中
我们提到的那两个函数。
同样,作为原生二进制存储,QByteArray中间也可以
存储'',而不必须是''在最后一位。
在有些情况下,我们希望把数据存储在一个变量中。
例如,我有一个数组,既
希望存整数,又希望存浮点数,还希望存string。
对于Java来说,很简单,
只要把这个数组声明成Object[]类型的。
这是什么意思呢?实际上,这里用到
的是继承。
在Java中,int和float虽然是原生数据类型,但是它们都有分别
对应一个包装类Integer和Float。
所有这些Integer、Float和String都是
继承于Object,也就是说,Integer、Float和String都是一个(也就是is-a
的关系)Object,这样,Object的数组就可以存储不同的类型。
但是,C++中没
有这样一个Object类,原因在于,Java是单根的,而C++不是。
在Java中,
所有类都可以上溯到Object类,但是C++中没有这么一个根。
那么,怎么实现
这么的操作呢?一种办法是,我们都存成string类,比如int i=10,我就存"10"字符串。
简单的数据类型固然可以,可复杂一些的呢?比如一个颜色?难
道要把ARGB所有的值都转化成string?这种做法很复杂,而且失去了C++的类型检查等好处。
于是我们想另外的办法:创建一个Object类,这是一个“很大很大的”类,里面存储了几乎所有的数据类型,比如下面的代码:
class Object
{
public:
int intValue;
float floatValue;
string stringValue;
};
这个类怎么样?它就足以存储int、float和string了。
嗯,这就是我们的思路,也是Qt的思路。
在Qt中,这样的类就是QVariant。