C、C++、Qt类型转换总结

2023-11-17

一、C类型转换

转换格式如下:

Type b = (Type)a

二、C++类型转换

1、const_cast

去掉类型的const或volatile属性。

const int a = 10;
a = 20;     // compile error

int& b = const_cast<int&>(a);
b = 20;     // compile ok,a==20,b==20
int a = 10;
const int *p = &a;
*p = 20;    // compile error

int* pp = const_cast<int *>(p);
*pp = 20;   // compile ok,a==20

const_cast<>里边的内容必须是引用或者指针。

2、static_cast

类似C风格的强制转换,进行无条件转换。

  • 基本数据类型转换,enum,struct,int,char,float等
  • 把任何类型的指针转换成void*。
  • 基类和子类之间的转换:其中子类指针转换为父类指针是安全的,但父类指针转换为子类指针是不安全的(基类和子类之间的动态类型转换建议用dynamic_cast)。
  • static_cast不能去掉类型的const、volatile属性(用const_cast)。
// 基本数据类型转换
int n = 6;
double d = static_cast<double>(n);

// 转换为void*
int* pn = &n;
void *p = static_cast<void*>(pn);

3、dynamic_cast

有条件转换,动态类型转换,运行时检查类型安全(转换失败返回NULL)。

  • 子类=>父类:安全。
  • 父类=>子类:安全,但是父类必须有虚函数,否则编译报错。
class Base
{
public:
    virtual void func() {}
};

class A : public Base
{};

int main() 
{
    A* a1 = new A();
    Base* base1 = dynamic_cast<Base*>(a1);   // 子类转父类,ok
    
    Base* base2 = new A();
    A* a2 = dynamic_cast<A*>(base2);    // 父类转子类,父类必须有虚函数,否则编译报错
    
    Base* base3 = new Base();
    A* a3 = dynamic_cast<A*>(base3);    // 父类转子类,结果为NULL
    
    return 0;
}

4、reinterpret_cast

仅重新解释类型,但没有进行二进制的转换:

  • 转换的类型必须是一个指针,应用、算术类型、函数指针或者成员指针。

  • 在比特级别上进行转换,可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。但不能将非32bit的实例转成指针。

  • 最普通的用途就是在函数指针类型之间进行转换。

  • 很难保证移植性。

int doSomething() 
{ 
    return 0; 
};

int main() 
{
    typedef void(*FuncPtr)(); //FuncPtr is 一个指向函数的指针,该函数没有参数,返回值类型为 void
    FuncPtr funcPtrArray[10]; //10个FuncPtrs指针的数组 让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数的指针存入funcPtrArray数组:

    funcPtrArray[0] = &doSomething;// 编译错误!类型不匹配,reinterpret_cast可以让编译器以你的方法去看待它们:funcPtrArray
    funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething); //不同函数指针类型之间进行转换

    return 0;
}
int main()
{
    int a = 10;
    int addr = (int)&a;     // 指针转int,编译器报警告,不推荐
    addr = reinterpret_cast<int>(&a);   // 指针转int,编译器不报警告,推荐
    
    return 0;
}

5、小结

去const属性用const_cast

基本类型转换用static_cast

多态类之间的类型转换用dynamic_cast

不同类型的指针类型转换用reinterpret_cast

三、Qt类型转换

1、qobject_cast

用于QObject类型父子类转换,与dynamic_cast类似。

限制条件:

  • 必须继承自QObject
  • 必须定义Q_OBJECT宏
int main()
{
    QObject* obj = new QTimer();
    QTimer* timer = qobject_cast<QTimer*>(obj); //  父类转子类,ok
    
    QAbstractButton* btn = qobject_cast<QAbstractButton*>(obj); // btn = NULL
    
    QTimer* timer1 = new QTimer();
    QObject* obj1 = qobject_cast<QObject*>(timer1); // 子类转父类,ok
    
    return 0;
}

2、qvariant_cast

将QVariant类型转换为实际的类型,与QVariant::value()功能一致。

struct MyData
{
    int a;
    float b;
};
Q_DECLARE_METATYPE(MyData)

int main()
{
    MyData data;
    data.a = 1;
    data.b = 2.0;
    
    QVariant variant;
    variant.setValue(data); // 数据存入QVariant
    
    MyData tempData = qvariant_cast<MyData>(variant); // 从QVariant取出数据
}



若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C、C++、Qt类型转换总结 的相关文章

  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • Qt程序部署到多平台,如何?

    我是 Qt 编程新手 我想开发一个程序 我想在 Windows Linux ubuntu 和 Mac 上运行 听说Qt支持多平台应用程序开发 但我的问题是 在我部署或编译后 任何 Qt 库都需要在 Ubuntu 中运行这个应用程序吗 如果您
  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win
  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • 如何在带有预编译头的项目中使用google protobuf

    我有一个包含多个项目的解决方案 我的项目 但不是全部 使用预编译头 我决定使用 protobuf 但遇到了一个问题 在 protoc exe 从 proto 生成 pb h 后 我尝试包含标头并收到错误 预编译标头未包含在 pb h 中 我
  • 错误 LNK2001:无法解析的外部符号 __CxxFrameHandler3

    我正在将 Qt 从 VS 2013 迁移到 Qt 5 10 1 到 VS 2015 出现以下多个链接错误 error LNK2001 unresolved external symbol CxxFrameHandler3 error LNK
  • QGraphicsScene::clear 不会改变 sceneRect

    我有一个 QGraphicsScene 场景 和 QGraphicsView graphicsView 我有一个画图的方法 当我需要重绘所有图形时 我调用这个方法 一切都好 但我意识到 scene gt clear 不会改变 sceneRe
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • 为 Windows 98 编译 Qt

    我需要支持 Windows 98 Qt 文档声称这是可能的 但没有说明 Qt 4 6 的分布式二进制文件不能在 Win98 上运行 而且我采样的大多数 Qt 应用程序也不能在 Win98 上运行 对于几个确实在 98 上运行的应用程序 我询
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 即使在可访问性中勾选应用程序,AXIsProcessTrustedWithOptions 也不会返回 true

    As this question https stackoverflow com questions 17693408 enable access for assistive devices programmatically on 10 9
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr
  • Qt:如何连接到 SQLite?

    我安装了 SQLite3 解压到 c sqlite 创建了一个数据库 c sqlite mzsales 现在我试图在 QTableView 中显示其内容 QSqlDatabase db QSqlDatabase addDatabase QS
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • Qml 模块未找到 CPP 类注册与新的 QML_ELEMENT r

    我尝试使用 Qt5 15 0 和新宏 QML ELEMENT 在 QML 中注册我的自定义 CPP 类 但找不到该模块 Qt Creater 帮助文件描述了 QML ELEMENT 的步骤 我也检查了 Qt 手册 但没有幸福的结局 http
  • Qt - 获取互联网上托管的网页的源代码(HTML 代码)

    我想获取网页的源代码 HTML 例如StackOverflow的主页 这是我到目前为止编写的代码 QNetworkAccessManager manager QNetworkReply response manager get QNetwo
  • 如何消除 QTableWidget 中的空白?

    How do I get rid of the whitespace in my application 我想摆脱 QTableWidget 中的空白 蓝色箭头 我该怎么做 这是我的应用程序的代码 gridLayout QGridLayou

随机推荐

  • hive-03-hive的分区

    1 hive分区与Bucket的畏难情绪 刚刚开始学习 这个的时候 一直感觉他比较难 看名字就觉得不好理解 但是实际上学起来超级简单 出现背景 这个东西为什么出来呢 来看一个需求 技术的的出现总是因为有了需求才会诞生的 假设我们有数据宾馆的
  • 1x pcie 引脚_PCIe 接口 引脚定义 一览表

    针脚号 定义 B 说明 定义 A 说明 1 12V 12V电压 PRSNT1 热拔插存在检测 2 12V 12V电压 12V 12V电压 3 RSVD 保留针脚 12V 12V电压 4 GND 地 GND 地 5 SMCLK 系统管理总线时
  • mac 安装 Adobe CC XD

    Adobe CC XD 在中国区已经免费 没什么破解一说 1 打开网址 https www adobe com cn products xd html 点击免费获取XD 下载 XD Installer dmg 2 双击 XD Install
  • sqli-labs/Less-13

    首先需要判断一下注入类型 输入如下 admin 存在报错信息 所以可以进行报错注入 但是无论正确与否都不会存在回显所以不能使用联合注入这题我们就是用报错注入吧 然后从报错信息我们可以知道注入类型为单引号注入 而且带有一个括号 我们进行作证
  • 图扑智慧城市

    十四五 新型城镇化实施方案 提出围绕提升城市治理能力智慧化水平提高数字政府服务能力 推行城市数据一网通用 城市运行一网统管 政务服务一网通办 公共服务一网通享 增强城市运行管理 决策辅助和应急处置能力 构建 人 企 地 物 政 五张城市基础
  • 输入商品单价和商品数量(输入负数时代表输入结束),自动计算商品总价,若支付金额不足会提示生育应付金额

    输入商品单价和商品数量 输入负数时代表输入结束 自动计算商品总价 若支付金额不足会提示生育应付金额 package day04 import java util Scanner public class Demo04 public stat
  • 在b站上跟着沐神学习深度学习

    算是给自己做个记录吧 每次学习之后都做点自己的笔记 加深一下印象吧 之前也看过一些资料 但是到头来还是有点乱 立下此贴为证 好好学习
  • python三位数水仙花数(附零基础学习资料)

    前言 所以直接上代码 python输入一个水仙花数 三位数 输出百位十位个位 从控制台输入一个三位数num 如果是水仙花数就打印num是水仙花数 否则打印num不是水仙花数 任务 1 定义变量num用于存放用户输入的数值 2 定义变量gw
  • TS中的泛型

    一 泛型是什么 有什么作用 当我们定义一个变量不确定类型的时候有两种解决方式 使用any 使用any定义时存在的问题 虽然 以 知道传入值的类型但是无法获取函数返回值的类型 另外也失去了ts类型保护的优势 使用泛型 泛型指的是在定义函数 接
  • 解除Discuz!X2的15分钟锁定

    第一种方法 清两个failedlogin空表 解除用户锁定 mysql gt delete from pre common failedlogin Query OK 1 row affected 0 02 sec 解除UC用户锁定 mysq
  • C/C++学习记录--double和float的区别

    单精度浮点数 float 与双精度浮点数 double 的区别如下 1 在内存中占有的字节数不同 单精度浮点数在机内占4个字节 双精度浮点数在机内占8个字节 2 有效数字位数不同 单精度浮点数有效数字8位 双精度浮点数有效数字16位 3 所
  • HertzBeat监控部署及使用

    易用友好的高性能监控告警系统 网站监测 PING连通性 端口可用性 数据库监控 API监控 自定义监控 阈值告警 告警通知 邮件微信钉钉飞书 安装部署 HertzBeat最少依赖于 关系型数据库MYSQL8 实际亲测用mysql5 7 也行
  • 用java.util.Timer定时执行任务

    用java util Timer定时执行任务 如果要在程序中定时执行任务 可以使用java util Timer这个类实现 使用Timer类需要一个继承了java util TimerTask的类 TimerTask是一个虚类 需要实现它的
  • 基于spring+struts2+hibernate实现的Java web论坛

    源码及论文下载 源码及论文下载 http www byamd xyz tag java 1 绪论 这次的实训项目是开发一个java论坛系统 而开发java论坛系统的目的是提供一个供java学习交流的平台 为Java程序员提供交流经验 探讨问
  • angular的form表单验证

    angular的form表单验证 注 基于日常工作的总结 只是基础用法 一般的情况下应该是够用了 本次总结是angular的响应式表单验证 不足之处欢迎指正 首先要在你的页面组件的ts文件中引入angular的表单模块 import For
  • ESP8266 无线wifi AT 指令操作详解

    分享一下 ESP8266 无线wifi AT 的常见指令操作详解 按照官方说明整理 如有问题请私信 再次修改 指令集分为 基础 AT 命令 Wifi 功能 AT 命令 TCP IP 工具箱 AT 命令等 指令分类 测试命令 该命令用于查询设
  • Qt关闭子线程时程序崩溃及解决

    在Qt关闭子线程时 一般使用quit 函数和wait 函数关闭子线程 但可能关闭子线程时 子线程正在接受信号工作 因此 需要在子线程工作之前使用while 工作 进行判断 同时在关闭线程的按钮中需要设置flag的布尔值 问题 点击关闭按钮的
  • Unity3D C#数学系列之点积

    文章目录 1 定义 2 几何意义 3 向量a 向量b xaxb yayb zazb 4 应用案例 4 1 求两向量的夹角 4 2 判断两向量是否垂直 4 3 判断NPC是否在攻击范围内 4 4 已知入射光线和表面法线求反射光线 5 项目 1
  • 期货反向跟单小资金适合做吗?

    反向交易得到了越来越多人的青睐 但我们对其依然停留在一个很朦胧的阶段 仿佛雾里看花 一看三不知 或许是听别人一说 或许哪里留意过 但是真正的去实践 去落地 反而不知从哪里下手了 需要做什么品种 招多少盘手 用多少资金 模拟多久 培训多久 等
  • C、C++、Qt类型转换总结

    一 C类型转换 转换格式如下 Type b Type a 二 C 类型转换 1 const cast 去掉类型的const或volatile属性 const int a 10 a 20 compile error int b const c