C++ 11 在 Qt 5 中的应用

C++ 11 现在已经是 C++ 标准,也就没有理由不在新的应用中使用。Qt 4.8 是第一个支持 C++ 11 特性的 Qt 版本,不过这里,我们首先介绍的是,Qt 5 中如何结合使用 C++ 11。至于 Qt 4.8,我们会在后续文章中进行阐述。

显而易见的是,比起 Qt 4.8,Qt 5 利用了更多的 C++ 11 新特性。下面我们来一个个见识一下:

slot 中使用 Lambda 表达式

Lambda 表达式是 C++ 11 带来的最激动人心的特性之一(豆子已经在前面几篇文章中不止一次说这样的话了 ;-P)。简而言之,它允许创建匿名函数。匿名函数则允许我们直接将一个函数作为参数传递,无需显式地声明。

Qt 4.8 实际已经可以使用这个特性。只不过在 Qt 4.8 中,Lambda 表达式只能用在 QtConcurrent 的某些函数。现在,前面我们也介绍过,Qt 5 有新的 signal/slot 语法,Lambda 表达式有了更大的用武之地。回忆一下,在你需要编写 slot 代码的时候,即使只有一条语句,你也必须为它单独建立一个函数。这不是很麻烦吗?现在,我们有了更好的写法:

Lambda 表达式现在已经被 MSVC 2010、GCC 4.5 和 clang 3.1 实现。

Unicode 字符串常量

C++ 11 允许你使用 u”HelloWorld” 的形式生成 UTF-16 字符串。Qt 利用这个特性增加了一个新的类QStringLiteral。这个类能够在编译时初始化QString,没有了运行时的时间消耗。

常量表达式 constexpr

C++ 11 增加了新的关键字constexpr,指示某些 inline 函数可以在编译期运算。在 Qt 5 中,我们引入了Q_DECL_CONSTEXPR宏,当所使用的编译期支持constexpr时,这个宏可以生成constexpr,否则的话则是空白。

在 Qt 源代码中,我们也利用这个宏改写了许多函数,例如:

注意,这里我们在枚举值前面使用可SomeEnum::前缀,这是 C++ 11 允许的,但是之前版本的 C++ 则不允许。

static_assert

在编译期使用static_assert检测问题,可以让 C++ 11 帮助我们可以组织处更好的错误信息。Qt 5 引入了Q_STATIC_ASSERTQ_STATIC_ASSERT_X两个宏。当static_assert可用时,这两个宏将使用static_assert,否则使用一些模板技巧。

为了产生更好的编译错误信息,Qt 在 API 不方便的地方大量使用了宏。

overridefinal

你遇到过这样的错误吗?自己定义的函数名看上去同父类的某个函数同名,但却的确有某些字母打错了,以至于并没有覆盖父类函数,从而让程序不能正确运行(或者是忘记了那函数名最后面的该死的const)?

现在,你可以选择在的确需要覆盖父类虚函数的地方加上Q_DECL_OVERRIDE。如果编译器支持的话,这个宏将展开为新增加的“override”关键字。这样的话,如果编译器支持 C++ 11,那么如果是简单的字母错误,你就会得到一个错误;当你重构虚函数、却忘记修改子类时,同样会引发一个错误。

注意,上面的flags()函数实际是想覆盖父类的同名函数,但是我们忘记了一个const,就会出现类似下面的错误:

如果虚函数不能覆盖,Qt 也提供了另外一个宏,Q_DECL_FINAL,这个宏展开为final

deleted 成员

当编译器支持 deleted 函数时,新增加的宏Q_DECL_DELETE将展开为=delete。这就允许我们能够为一些常见错误提供更好的编译器错误信息。

deleted 函数用于显式地删除那些不允许编译器自动生成的函数(例如默认构造函数、默认拷贝运算符等)。deleted 函数不能被调用,如果被使用的话,将会出现一个编译器错误。

我们可以将其用于Q_DISABLE_COPY宏。在此之前,为了实现同样的目的,我们的做法是将其声明为private的。尽管效果相同,但是错误信息却并不友好。

右值引用和移动构造函数

在这里,我假定你明白什么叫做“右值引用”。如果不明白,我们会在后面的文章中详细说明。Qt 5 已经在内部进行了调整,以便支持移动构造函数。因此,你可以大胆的使用他们了!

结论

对于 C++ 11,MSVC 不需要任何特殊的编译参数,而 GCC 和 Clang 则需要添加 -std=c++0x。

默认情况下,Qt 5 本身会使用 C++ 11 编译参数进行编译(如果可能的话)。

如果你使用的是 qmake,那么,在使用 Qt 5 构建的程序的 .pro 文件中,你需要增加这么一句:

(顺便提一句,在 Qt 4 中,如果你需要使用 C++ 11 的新特性,则应该增加gcc:CXXFLAGS += -std=c++0x。具体细节,我们会在后面的文章中说明。)

现在,好好利用 C++ 11 所带来的新特性吧!私以为,仅仅为了auto这一特性,就应该尽快使用 C++ 11 了!;-p

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/242846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多媒体表示、描述、编码以及通信的相关规定和标准课程总结

时间:2016.10.11-2016. 11.3注意关注会议机构ITU(国际电信联盟) MPEG: Moving Picture Experts Group,动态图像专家组, 是ISO(International Standardization Organization,国际标准化组织&…

建模与仿真的流程

建模与仿真的流程 以例子为例 第一步:建立模型,列出输出表达式 第二步:解出输出方程 可以参考:解单位冲激 第三步:在simulink中建立仿真图 ctrlr:表示旋转90 按住ctrl可以引出多条线 点击保存&…

AD制图相关问题总结

AD制图总体步骤新建一个工程文件File ->New->Project->PCB.Project->save新建原理图在此工程目录下新建原理图与PCB并保存 File ->New->Schematic->save生成PCB(前提是原理图已完成且没有错误)File->New-> PCB->save&…

vcs 入门

synopsys vcs 软件是仿真和验证的软件,必须掌握。 vcs 即 verilog compile simulator 支持 verilog, systemVerilog, openvera, systemC等语言,同时也有代码覆盖率检测等功能。 可以合第三方软件集合使用,例如 Vera , Debussy ,S…

输入输出及子模块

输入输出及子模块 常用模块库 1 事先规划好功能子系统 2 建立好系统后对系统进行功能划分 在进行动态系统的建模过程中,可以根据需要将模型中比较复杂,或者共同完成某一功能的基本模块(低一层次的子系统)封装起来,并…

使用Hexo搭建博客步骤详解

简介hexo —— 简单、快速、强大的Node.js静态博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 特性风一般的速度Hexo基于Node.js,支持多进程,几百篇文章…

32个最热CPLD-FPGA论坛

1. OPENCORES.ORG 这里提供非常多,非常好的PLD了内核,8051内核就可以在里面找到。进入后,选择project或者由http//www.opencores.org/browse.cgi/by_category进入。对于想了解这个行业动态人可以看看它的投票调查。http://www.opencores.org/…

师兄师姐就业分享会

华为算法工程师自我定位(找一个岗位,好好准备); 来自当年带我走上这条路的学长 。算法工程师对学术要求比较高,发过高水平论文优势很大 通常是月薪14k以上,年薪20万以上,只是一个概数,具体薪资详…

简单模块说明

接地模块(Ground)和终端模块(Terminator) 进入接地模块的帮助系统 右击选择帮助 接地模块表示:输入模块中没有值的部分 Ground 模块连接到其输入端口不连接到其他模块的模块。如果您使用具有未连接的输入端口的模块运…

毫米波雷达和车联网在未来无人驾驶中的应用和比较

来源:来自新加坡南阳理工大学电气与电子信息工程学院的陆亿泷教授,研究领域包括雷达、天线、微波工程、阵列信号处理、电磁计算、复杂问题的遗传算法优化等。会议时间:2017年8月9日 恩智浦恩智浦 半导体(NASDAQ:NXPI)致力于通过安全连接及基础…

机器学习总结

转摘的,忘记连接了朴素贝叶斯 P(A∩B)P(A)*P(B|A)P(B)*P(A|B) 所以有:P(A|B)P(B|A)*P(A)/P(B) 对于给出的待分类项,求解在此项出现的条件下各个目标类别出现的概率,哪个最大,就认为此待分类项属于哪个类别 工作原理 假…

贷款时,如何评估借款人的还款意愿

贷款有一个公式:正常还款还款能力还款意愿。也就是说借款人能不能正常还款,除了借款人的还款能力之外,借款人的还款意愿也有着至关重要的作用。因此贷款审核过程中,对借款人还款意愿的审核是很重要的一个环节,那信贷员…

FPGA时序分析和约束实例

FPGA时序分析和约束实例

数据库设计笔记——概述(一)

数据库数据库(DataBase,DB)是长期存储在计算机内,有组织的,可共享的数据集合。是存放数据的仓库,并且有组织,有管理。数据库管理系统数据库管理系统(Database Management System&…

你应该知道的浮点数基础知识

本文从一个有趣而又令人意外的实验展开,介绍一些关于浮点数你应该知道的基础知识 文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部 作者:卢钧轶(cenalulu) 本文原文地址:http://cenalulu.github.io/linux/about…

简单模块说明(二)

简单模块说明(二) 利用linmod函数提取状态矩阵 输入输出必须以 in模块和out模块代替 状态空间法的状态向量和状态变量不唯一的。 传递函数模块 得出其是个低通滤波器 零极点增益模块 使用零极点增益来表示传递函数 PID及二阶积分模块 几…

数据库设计笔记——有效设计数据库的目标(二)

参考《数据库设计解决方案》 数据设计关系到整个系统/软件的质量。数据库是一种存储数据的工具,允许以某种方式创建、阅读、更新和删除数据 理想的数据库特性CRUD创建、阅读、更新、删除(必备的四个操作)检索能快速、可靠地查找到数据库中的所…

GNU编译优化级别-O -O1 -O2 -O3

最近做一个算法的GPU加速,发现实际上使用gcc的-O3(最高级编译优化)选项,可以获得很高的加速比,我的程序里达到了3倍的样子,有时效果甚至比GPU加速好。因此小小学习了下GNU的编译优化。 附言一句,在进行调试的时候&…

数据库设计笔记——关系型数据库基础知识(三)

表的行称为元组,列称为属性,行列相交的部分称为单元;关系必须规范化,属性不可再分。(每个属性必须是不可分割的最小数据单元,即表中不能再包含表);主键(Primary Key&…

模块说明(三)

模块说明(三) 惯性环节、超前滞后环节 一般先使用连续列出传递函数,然后通过极性法或者双线线性不变法将连续转换为离散。 实例讲解 通常是通过电子电路对其进行补偿的。 记忆模块、零阶保持器、一阶保持器 离散PID 可参考连续PID…