《深入理解C++11:C++11新特性解析与应用》笔记七

第七章 为改变思考方式而改变

7.1 指针空值--nullptr

7.1.1 指针空值:从0到NULL,再到nullptr

传统C头文件里NULL是一个宏定义:

在函数重载同时出现int和char *参数版本的函数时,使用NULL作为参数调用函数会调用int参数版本,而不是我们想要的char*参数版本。 引起该问的元凶是字面常量0的二义性,既可以是一个整型,也可以是一个无类型指针void*。除非对字面常量0进行强制类型转换b=并调用,否则编译器总是会优先把0看作是一个整型常量。

c++出于兼容性考虑,并没有消除字面常量0的二义性。但是引入了作为指针空值类型的常量nullptr,指针空值类型被命名为nullptr_t。nullptr是关键字,nullptr是有类型的,只能被隐式转化为指针类型,所以nullptr做参数可以成功调用char*版本的函数。

7.1.2 nullptr和nullptr_t

c++11标准不仅定义了指针空值常量nullptr,也定义了其指针空值类型nullptr_t。c++11标准严格规定了数据间的关系:

1.所有定义为nullptr_t类型的数据都是等价的,行为也是完全一致的。

2.nullptr_t类型数据可以隐式转换成任意一个指针类型。

3.nullptr_t类型数据不能转换为非指针类型。

4.nullptr_t类型数据不适用于算术运算表达式。

5.nullptr_t类型数据可以用于关系运算表达式,但仅能与nullptr_t类型数据或者指针类型数据进行比较,当且仅当关系运算符为==、<=、>=等时返回true。

7.1.3 一些关于nullptr规则的讨论

nullptr类型数据所占用的内存空间大小跟void*相同。

nullptr到任何指针的转换是隐式的,而(void*)0则必须经过类型转换后才能使用。

nullptr_t对象的地址可以被用户使用。虽然nullptr也是一个nullptr_t的对象,但它被定义为一个右值常量,因此用户不能获得nullptr的地址。

7.2 默认函数的控制

7.2.1 类与默认函数

在c++中声明自定义的类,编译器会默认生成一些被称为默认函数的成员函数,包括:

构造函数、拷贝构造函数、拷贝赋值函数(operator=)、移动构造函数、移动拷贝函数、析构函数。

c++编译器还会为以下这些自定义类型提供全局默认操作符函数:

operator ,,operator &,operator &&,operator *,operator ->,operator ->*,operator new,operator delete。

一旦实现了这些函数的自定义版本,则编译器不会再为该类自动生成默认版本。声明了带参的构造函数版本,必须声明不带参版本以完成无参的变量初始化。声明了自定义版本的构造函数,有可能导致自定义类型不再是POD的。

C++11中,可以在默认函数定义或者声明时加上"= default"来显式地指示编译器生成该函数的默认版本。另一方面,有时候又希望可以限制一些默认函数的生成,譬如有时候需要禁止使用拷贝构造函数,c++11中,可以在默认函数定义或者声明时加上“= delete”来显式地指示编译器不生成函数的缺省版本。

7.2.2 “= default”与“= deleted”

c++11中,也可以在类定义外显式指定缺省版本,这样可以对一个class定义提供多个实现版本,通过选择性编译,从而在提供缺省函数和自定义版本间切换。

c++11并不要求编译器为“operator ==”之类的函数提供缺省实现,但是将其声明为显式缺省的话,编译器会按照某些标准行为为其生成所需的版本。

显式删除可以避免用户使用一些不应该使用的类的成员函数,也可以避免编译器做一些不必要的隐式数据类型转换,例如:

隐式删除不应该和explicit同用。在下面的例子中:

显式删除导致显式构造的cc变量编译出错,但是Func调用中,编译器会尝试隐式地将char转为int,从而调用一次ConvType(int)构造函数,因而能通过编译。

显式删除并不局限于缺省版本的类成员函数或者全局函数上,对于普通函数,依然可以通过显式删除来禁止类型转换。

7.3 lambda函数

7.3.1 lambda的一些历史

7.3.2 c++11中的lambda函数

lambda函数的语法定义:

捕捉列表由多个捕捉项组成,以逗号分割,有如下形式:

[var]表示值传递方式捕捉变量var,[=]表示值传递方式捕捉所有父作用域的变量,[&var]表示引用传递捕捉变量var。[&]表示引用捕捉所有父作用域的变量。[this]表示值传递方式捕捉当前this指针。还可以进行组合,例如[=,&a,&b]表示引用传递方式捕捉a和b,其他变量以值传递方式捕捉。

默认情况下lambda函数总是一个const函数,mutable可以取消其常量性,使用时参数列表不可省略。

不需要返回值的时候也可以连同符号->一起省略。

c++11标准规定在块作用域以外的lambda函数捕捉列表必须为空,而在块作用域中的lambda函数仅能捕捉父作用域中的自动变量。

7.3.3 lambda与仿函数

在c++11之前,我们在STL中会用到一种特别的对象,称之为函数对象,或者仿函数functor,也就是重定义了成员函数operator()的一种自定义类型对象。在使用它的时候,在代码层面跟函数的使用一样,但本质却是一种对象。仿函数是编译器实现lambda的一种方式。现阶段,通常编译器会把lambda函数转化为一个仿函数对象。

7.3.4 lambda的基础使用

lambda可用于实现局部函数。

7.3.5 关于lambda的一些问题及有趣的实验

如果需要捕捉的值称为lambda函数的常量,通常需要使用按值传递的方式捕捉。反之,需要捕捉的值称为lambda函数运行时的变量,则应采用按引用方式进行捕捉。

lambda的类型并非简单的函数指针或者自定义类型,lambda的类型被定义为闭包的类,每个lambda表达式会产生一个闭包类型的临时对象(右值)。不过c++标准允许lambda表达式向函数指针的转换,前提是函数没有捕捉任何变量,且函数指针所示的函数原型,必须跟lambda函数有这相同的调用方式。

lambda函数的常量性及mutable关键字。现有c++11标准中lambda等价的是有常量成员函数operator()的仿函数,捕捉列表中的变量都会成为等价仿函数的成员变量,而常量成员函数中改变其值是不允许的,因而在按值捕捉的变量在没有声明为mutable的lambda函数中改变其会导致编译器报错。可以通过mutable修饰符消除其常量性,不过更推荐使用引用捕捉。

7.3.6 lambda与STL

当循环次数较多时,内联的lambda函数比函数指针性能好。函数指针应用范围相对狭小,特别是需要具备一些运行时才能决定的状态时,以前或许会使用仿函数,现在则可以选用lambda。

7.3.7 更多的一些关于lambda的讨论

在现有c++11中,lambda不是仿函数的完全替代者,这点很大程度上是由lambda的捕捉列表的限制造成的。仿函数可以被定义以后在不同的作用域范围内取得初始值,这使得仿函数天生具有跨作用域共享的特征。lambda函数被设计的目的,就是要就地书写,就地使用。

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

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

相关文章

elasticsearch系列九:异地容灾-CCR跨集群复制

概述 起初只在部分业务中采用es存储数据&#xff0c;在主中心搭建了个集群&#xff0c;随着es在我们系统中的地位越来越重要&#xff0c;数据也越来越多&#xff0c;针对它的安全性问题也越发重要&#xff0c;那如何对es做异地容灾呢&#xff1f; 今天咱们就一起看下官方提供的…

【电商项目实战】商品详情显示与Redis存储购物车信息

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《电商项目实战》。&#x1f3af;&#x1f3af; &am…

合伙企业有哪些分类

合伙企业分为&#xff1a;普通合伙企业和有限合伙企业。其中&#xff0c;普通合伙企业又包含特殊的普通合伙企业。 1、普通合伙企业由2人以上普通合伙人(没有上限规定)组成。 普通合伙企业中&#xff0c;合伙人对合伙企业债务承担无限连带责任。 特殊的普通合伙企业中&#xf…

软件测试/测试开发丨Python 封装 学习笔记

封装的概念 封装&#xff08;Encapsulation&#xff09; 隐藏&#xff1a;属性和实现细节&#xff0c;不允许外部直接访问暴露&#xff1a;公开方法&#xff0c;实现对内部信息的操作和访问 封装的作用 限制安全的访问和操作&#xff0c;提高数据安全性可进行数据检查&#x…

『番外篇九』SwiftUI 实战:打造一款“五脏俱全”的网络图片显示 App(上)

概览 俗话说得好:“读书破万卷,下笔如有神”。不过如果把这句话放到编程的学习上可就不那么贴切了。 要想熟练掌握一门编程语言,光看书是绝对不够的。我们还需尽可能的多撸码、早撸码,撸到无路可退、海枯石烂才有可能一窥门径。 在本篇和续篇博文中,我们将和小伙伴们一起…

c++_09_继承

1 继承 C的继承是弱继承 继承的语法&#xff1a; class 子类 : 继承方式1 基类1, 继承方式2 基类2, ... { ... }; 继承方式&#xff1a; 共有继承 public 保护继承 protected 私有继承 private 2 继承的基本属性&#xff08;3种继承方式均有&#xff09; 继承所…

Javaweb之JDBC的详细解析

2. JDBC介绍(了解) 2.1 介绍 通过Mybatis的快速入门&#xff0c;我们明白了&#xff0c;通过Mybatis可以很方便的进行数据库的访问操作。但是大家要明白&#xff0c;其实java语言操作数据库呢&#xff0c;只能通过一种方式&#xff1a;使用sun公司提供的 JDBC 规范。 Mybatis…

从 MySQL 的事务 到 锁机制 再到 MVCC

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、事务 1.1 含义 1.2 ACID 二、锁机制 2.1 锁分类 2.2 隔离级别 三、MVCC 3.1 介绍 3.2 隔离级别 3.3 原理 四、总结 前…

【2023年度总结】 何其有幸 年岁并进 一元复始 万象更新

&#x1f319; 新年将至&#xff0c;万物更新&#xff0c;旧疾当愈。 今年极度焦虑。发生太多事情&#xff0c;做出很多改变。 自律。早起、拍照、运动、读书、学习、认识了很多厉害的朋友&#xff0c;尝试影响周围的人。这是我生活正向能量的来源。 学习。今年依然是把大量…

C#上位机与欧姆龙PLC的通信06---- HostLink协议(FINS版)

1、介绍 对于上位机开发来说&#xff0c;欧姆龙PLC支持的主要的协议有Hostlink协议&#xff0c;FinsTcp/Udp协议&#xff0c;EtherNetIP协议&#xff0c;本项目使用Hostlink协议。 Hostlink协议是欧姆龙PLC与上位机链接的公开协议。上位机通过发送Hostlink命令&#xff0c;可…

python实现Ethernet/IP协议的客户端(二)

Ethernet/IP是一种工业自动化领域中常用的网络通信协议&#xff0c;它是基于标准以太网技术的应用层协议。作为工业领域的通信协议之一&#xff0c;Ethernet/IP 提供了一种在工业自动化设备之间实现通信和数据交换的标准化方法。python要实现Ethernet/IP的客户端&#xff0c;可…

【Linux】socket基础API

目录 1. 创建socket&#xff08;TCP/UDP&#xff0c;客户端服务器&#xff09; 1.1 第一个参数——domain 1.2 第二个参数——type 1.3 第三个参数——protocol 2. 绑定socket地址&#xff08;TCP/UDP&#xff0c;服务器&#xff09; 2.1 字节序及转换函数 2.2 IP地址及…

消融实验(ablation study)——全网最全解读

消融实验&#xff08;ablation study&#xff09; 是什么优势与劣势案例总结 是什么 消融实验是一种科学研究方法&#xff0c;用于确定一个条件或参数对结果的影响程度。当研究者提出了一个新的方案或方法时&#xff0c;消融实验通过逐一控制一个条件或参数&#xff0c;来观察…

6个火爆全网的AI开源项目,用上月10万+

标题月10万可能说的有点夸张和含糊&#xff0c;10万具体指的是你可以利用这些开源项目实现&#xff1a; 访问量10万 收入10万 用户10万 …… 开源项目只是免费的工具&#xff0c;具体怎么实现还需要你根据自己需求去深入运营。这里只是给你推荐一些比较热门的开源项目&…

基于QT开发的温室气体数据记录软件

1、概述 温室气体分析仪数据记录软件用于实现温室气体分析仪数据的获取与存储&#xff0c;阀箱数据的获取与存储、冷阱数据的获取与存储、采样单元数据的获取与存储、阀箱和采样单元的远程操作以及系统功能的管理。其主操作界面如下&#xff1a; 上述软件界面分为2各区域&…

用html,js和layui写一个简单的点击打怪小游戏

介绍&#xff1a; 一个简单的打怪小游戏&#xff0c;点击开始游戏后&#xff0c;出现攻击按钮&#xff0c;击败怪物后可以选择继续下一关和结束游戏。 继续下一个怪兽的血量会增加5点&#xff0c;攻击按钮会随机变色。 效果图&#xff1a; html代码&#xff1a; <!DOCTYPE…

QDialog

属性方法 样式表 background-color: qlineargradient(spread:reflect, x1:0.999896, y1:0.494136, x2:1, y2:1, stop:0 rgba(0, 0, 0, 255), stop:1 rgba(255, 255, 255, 255));border: 1px groove rgb(232, 232, 232);border-radius: 20px; QDialog 的常用方法&#xff1a; e…

前端 js 基础(1)

js 结果输出 &#xff08;点击按钮修改文字 &#xff09; <!DOCTYPE html> <html> <head></head><body><h2>Head 中的 JavaScript</h2><p id"demo">一个段落。</p><button type"button" onclic…

基于PHP的校园代购商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的校园代购商城系统 一 介绍 此校园代购商城系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。(附带参考设计文档) 技术栈&#xff1a;phpmysqlbootstrapphpstudyvscode 二 功能 …

2023/12/30 c++ work

定义一个Person类&#xff0c;私有成员int age&#xff0c;string &name&#xff0c;定义一个Stu类&#xff0c;包含私有成员double *score&#xff0c;写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数&#xff0c;完成对Person的运算符重载(算术运算符、条件运算…