Qt中的重载“<<“运算符

2024-09-03 03:04
文章标签 qt 重载 运算符

本文主要是介绍Qt中的重载“<<“运算符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

因为看到Qt中重载流操作符和C++中重载流操作符好像不一样,所以想研究一下。

正文

在C++中

//左移运算符的重载是<<
//为了实现直接打印对象
class Person
{
public:int m_a;int m_b;
};
//一般不会利用成员函数重载左移运算符,因为若是成员函数,则调用这个运算符就变成了p.operator<<(cout,p);这样就自己调用自己的成员函数并且把自己当做变量传递给函数
//而且调用的时候p.operator<<(cout)会被解释为p<<cout(因为是p调用的函数),为了使得cout在左侧
//故只能用全局函数重载<<
ostream& operator<<(ostream& cout, Person& p)//返回值是ostream&类型是为了实现cout后可以无限追加<<
{cout << "m_a = " << p.m_a << " m_b = " << p.m_b;return cout;
}
void test0()
{Person p1;p1.m_a = 13;p1.m_b = 23;cout << p1 << endl;}

不懂为什么的可以去看b站黑马视频

在Qt中

实现打印自定义类
#ifndef ARCHIEVEPRINT_H
#define ARCHIEVEPRINT_H#include <QObject>
#include <QDebug>class ArchievePrint : public QObject
{Q_OBJECT
public:explicit ArchievePrint(QObject *parent = nullptr);// 声明为友元函数friend QDebug operator<<(QDebug dbg, const ArchievePrint& obj);signals:private:int m_data;QString m_str;qreal m_fdata;
};#endif // ARCHIEVEPRINT_H//cpp
#include "archieveprint.h"ArchievePrint::ArchievePrint(QObject *parent): QObject(parent),m_data(10),m_str("hello qDebug"),m_fdata(3.0)
{}// 重载 QDebug 的 << 运算符
QDebug operator<<(QDebug dbg, const ArchievePrint& obj) {// 保存当前的 QDebug 状态QDebugStateSaver saver(dbg);dbg.nospace() << " m_data:" << obj.m_data << " m_str:" <<obj.m_str <<" m_fdata:" <<obj.m_fdata;return dbg.space();
}// main.cpp
#include <QCoreApplication>
#include "archieveprint.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);ArchievePrint apt;qDebug()<< apt;return a.exec();
}

运行结果
在这里插入图片描述

实现自定义类的序列化和反序列化
#ifndef ARCHIEVESERIALIZATION_H
#define ARCHIEVESERIALIZATION_H#include <QObject>
#include <QTextStream>
#include <QDataStream>class ArchieveSerialization : public QObject
{Q_OBJECT
public:explicit ArchieveSerialization(QObject *parent = nullptr);ArchieveSerialization(qreal data,QObject *parent = nullptr);// 重载QTextStream的<<,用于序列化friend QTextStream& operator<<(QTextStream& out, const ArchieveSerialization& obj);// 重载QTextStream的>>,用于反序列化friend QTextStream& operator>>(QTextStream& in, ArchieveSerialization& obj);
// 这两个就不写了,和上面两个一样
//    // 重载QDataStream的<<,用于序列化
//    friend QDataStream& operator<<(QDataStream& out, const ArchieveSerialization& obj);
//    // 重载QDataStream的>>,用于反序列化
//    friend QDataStream& operator>>(QDataStream& in, ArchieveSerialization& obj);signals:private:qreal value;};#endif // ARCHIEVESERIALIZATION_H//cpp
#include "archieveserialization.h"ArchieveSerialization::ArchieveSerialization(QObject *parent) : QObject(parent)
{}ArchieveSerialization::ArchieveSerialization(qreal data,QObject *parent)
{value = data;
}QTextStream &operator>>(QTextStream &in, ArchieveSerialization &obj)
{in >> obj.value;return in;
}QTextStream &operator<<(QTextStream &out, const ArchieveSerialization &obj)
{out << obj.value;return out;
}// main.cpp
#include <QCoreApplication>
#include "archieveserialization.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);ArchieveSerialization obj1(3.0), obj2(5.0), obj3(3.7);QTextStream out(stdout);out << "output data:"<<obj1<<" "<<obj2<<" "<<obj3<<endl;return a.exec();
}

运行结果
在这里插入图片描述

话题之外

"<<"">>"对于整形数据而言如 int, unsigned int, long, short 等就是左移、右移运算符号,左移一位相当于乘以2,移动3位相当于乘以8,右移一位相当于除以2,移动三位相当于除以8,如

    int a = 3, b = 23, c = 11, d = 234;a = a<<1;b = b>>1;c = c<<3;d = d>>3;qDebug()<<"a:"<<a<<" b:"<<b<<" c:"<<c<<" d:"<<d;//运行结果a: 6  b: 11  c: 88  d: 29

小结

我现在才明白我们根据我们所需要的功能进行重载,比如我想调用qDebug直接打印我自定义类的对象,那么我这个类就要重载QDebug<<操作符;当我想通过流操作符序列化和反序列化自定义类的内容时,就可以重载QTextStream 或者QDataStream 的流操作符。

这篇关于Qt中的重载“<<“运算符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131840

相关文章

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

C# List.Sort四种重载总结

《C#List.Sort四种重载总结》本文详细分析了C#中List.Sort()方法的四种重载形式及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录1. Sort方法的四种重载2. 具体使用- List.Sort();- IComparable

Python海象运算符:=的具体实现

《Python海象运算符:=的具体实现》海象运算符又称​​赋值表达式,Python3.8后可用,其核心设计是在表达式内部完成变量赋值并返回该值,从而简化代码逻辑,下面就来详细的介绍一下如何使用,感兴趣... 目录简介​​条件判断优化循环控制简化​推导式高效计算​正则匹配与数据提取​性能对比简介海象运算符

C语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达

C# 空值处理运算符??、?. 及其它常用符号

《C#空值处理运算符??、?.及其它常用符号》本文主要介绍了C#空值处理运算符??、?.及其它常用符号,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、核心运算符:直接解决空值问题1.??空合并运算符2.?.空条件运算符二、辅助运算符:扩展空值处理

Qt实现删除布局与布局切换功能

《Qt实现删除布局与布局切换功能》在Qt应用开发中,动态管理布局是一个常见需求,比如根据用户操作动态删除某个布局,或在不同布局间进行切换,本文将详细介绍如何实现这些功能,并通过完整示例展示具体操作,需... 目录一、Qt动态删除布局1. 布局删除的注意事项2. 动态删除布局的实现步骤示例:删除vboxLay

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运