侯捷老师C++学习笔记——大气编程(下)

2023-05-16

侯捷老师C++课程下半部分。本课程是对之前课程中所提的一些东西的补充,以及C++11新特性的一些讲解。

Lesson1 介绍

本课程会讲的内容:

  • 泛型编程
  • 深入探索面向对象继承关系所形成的的对象模型,包括隐藏在底层的this指针,虚指针,虚表等。

Lesson2 转换函数 conversion function

转换有两个方向,一个是我这个类型转换成那个,也可以是那个转换成这个。

现在有一个分数class:

image-20211110201213702

黄色的部分就是转换函数。转换肯定不会改变数据的值,所以要加上const。

不需要返回值类型,因为很明确,函数名就表示了要转换的那个类型。

调用的时候:

Fraction f(3,5);
double d=3+f;//调用operator double()将f转为0.6

在这里,编译器会首先找一个全局函数,看是不是有+运算符重载函数,如果没有,就去找转换函数,此时再调用转换函数。

只要你认为合理,可以有很多个转换函数。

non-explicit-one-argument ctor

再来看下面这种情况,构造函数前可以加 explicit 关键字。现在是不加这个关键字的情况。

首先构造函数有两个形参,其中一个给了初值。其实调用的时候,只要给一个实参即可。

image-20211110202233538
Fraction f(3,5);
double d=f+3;

这时在执行上述代码时,类中的运算符重载函数并没有分数加整型数这种情况,只有分数加分数。当看到没有这种重载+ 这种函数,所以就想着可不可以把整型数3变为Fraction,那就看其构造函数,如果满足构造函数的参数,那么就会调用构造函数来进行类型的转换。这是让其他类型的数据转化成本类型。

但是当有下面这种情况时,既可以用构造函数,又可以用类型转换函数。此时编译器会报错,因为它不知道调用哪个函数。

image-20211110203235669

explicit-one-argument ctor

当在构造函数加上关键字explicit后,就可以避免上述问题发生。expilcit意思为明白的,明确的。在该关键字的限制下,构造函数就是创建新对象的时候调用,告诉编译器,不要在隐形转换的时候调用。

看下面的例子:

image-20211111065659372

这里出错显示:[Error]conversion from 'double' to 'Fraction' request ,在一开始看到f+4时,编译器会先找重载运算符函数,发现只有分数加分数,所以要把4转化成分数,但是该构造函数前加上了explict,所以不能走这条路。于是又找到类型转换函数,这条路可以走通,最终得到结果4.6,但是要把4.6赋值给d2,没有这种类型转换函数。

Lesson3 pointer-like classes

设计一个class,让它像指针。为什么这么做呢,就是想设计一个比指针功能更强大的东西。

关于智能指针

image-20211111072414463

shared_ptr是一个智能指针的模板类。我们写了一个Foo类,然后创建一个智能指针sp,这个过程中shared_ptr<Foo> sp(new Foo) 会调用构造函数,向智能指针中传入指针的值。

*sp调用了重载运算符*函数。返回值为该对象。

这里要注意sp->method(),这句话会调用重载运算符函数,返回值是一个指针,虽然->在调用函数后就已经“消耗了”,返回的是一个指针,相当于已经没有了-> ,但是为了保证符号的一致性,总不能写成sp->->method(),所以它就相当于px->method() ,就不用再写一遍了。

关于迭代器

迭代器也是一种智能指针,指向容器中的一个元素。但是和上面说的智能指针略有不同。

它不但要处理* -> ,还要处理 ++ -- == != 等。

Lesson4 function-like classes

写一个class,让它像一个函数。即仿函数。

形式为typername()(),前面的括号是创建一个临时对象,然后再加一个括号,是调用运算符重载函数。

Lesson5 member template 成员模板

模板主要分三大类:

  • class template
  • function template
  • member template

下面是member template的代码:

image-20211111080704918

在类中,构造函数为一个模板函数,这样在初始化的时候,会有更大的弹性。 因为模板函数不需要特别指定具体的类型,会自动推导。所以只在外面写好要创建的类,待传入初始化值时,类中的模板函数会自动推导出初始化值得类型。

Lesson6 模板特化(specialization)

在使用模板的时候,我们可以随机指定任何的类型,然后把该类型放到模板中。这就是泛化的概念。

但是有时候,我们想在一些特定的类型时,不使用泛化的模板,而是有一些特别之处。这就是模板特化。

语法:

image-20211111082640173

在使用的时候,例如上面的例子,编译器会找,泛化也可以,特化也可以,正如代码所写,特别指定的类型是long,所以就找到对应的模板。

Lesson7 偏特化(partial specialization)

个数上的偏

语法:

image-20211111083230419

在这里,我们只想让模板中的某几个类型特化,如上,我们想让T特化,而且Alloc有默认类型。

那么语法就是,在下面写上不特化的类型(特化的类型那块还是空着,对比全特化,尖括号里全是空)。

范围上的偏

泛化的模板输入的类型可以是任意的,当我们想缩小一下范围,指定具体的某几个类型,例如,是指针类型,但是没有说明是什么的指针。

语法:

image-20211111083910643

这是后,obj1用的就是泛化的模板。obj2用的是特化的模板。

Lesson8 template template parameter 模板模板参数

image-20211111084146414

Container可以是任意的字。模板模板参数就是,尖括号内第一项的模板参数,告诉有T这个模板类型存在。然后第二项模板参数是一个模板类,该模板类还需要模板参数,这样就形成了模板模板参数。

模板类的名字我们可以指定(因为类就可以当做是一个数据类型)

就是很绕,但其实不难的。

然后我们使用的时候,是这样的:

XCLs<string,list> mylst1;

这句话虽然是报错的,但是我们写的模板模板参数啥的都没有问题,报错的主要原因是list这个容器的模板参数有好几个,虽然模板参数是有默认值的,但是在模板中使用必须要指出。所以得加上中间那两句话。

模板中参数前面的关键字,有时候是typename,有时也可以是class,有什么区别呢。注意这里只有在 <>中,定义模板参数的时候,是共通的。如template<typename T,class U> ,这是共通的。但是当像上面写模板模板参数的时候,用到的class,这是不能共通的,这里的class表示是一个类,而不是一个模板参数。

Lesson9 关于标准库

任何语言的标准库都十分重要,应该能熟练的使用。

C++的标准库主要有以下几个部分:

image-20211111093957659
  • 容器:就是数据结构。
  • 算法:实现一些功能的方法。

程序就是靠算法和数据搭建起来的,algorithms+data=program。

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

侯捷老师C++学习笔记——大气编程(下) 的相关文章

  • java Collections基本概念和常用方法

    Collections是一个类 他在java的util包下 所以使用它是需要导包的 Collections是一个静态方法的集合类 他里面的方法都是静态的 Collections中的方法有很多 这里我们主要看三个 Collections的方法
  • 使用域控批量安装软件

    域自带的批量部署软件有多种方式 xff1a 1 xff0c 发布 xff0c 域服务器发布软件 xff0c 客户端到添加删除程序 添加新程序中点击安装 2 xff0c 分配指派到用户 xff0c 在客户端用户登录时自动安装 3 xff0c
  • XXL-JOB:com.fasterxml.jackson.databind.JsonMappingException: Unexpected character (‘o‘ (code 111))解决

    背景 项目中的xxl job admin版本为2 1 1 xff0c 一直运行的很好 xff0c 但是有一天被扫出安全漏洞 xff0c 然后 xff0c 我就把xxl job admin的springboot版本由1 5升级为2 2 1版本
  • Ubuntu部分图标缺失,包括部分系统图标

    ubuntu部分图标缺失 这里说的缺失不是指图标不会显示 xff0c 而是说图标虽然会显示 xff0c 但是显示不正确 比如显示为一个空白方块或者红色的 34 禁止 34 图标 简要列出部分缺失的图标 xff1a 文件夹图标wifi图标 x
  • python 添加图例_Python | 在图上添加图例

    python 添加图例 Adding legend is the best way to label data series plotted on a graph Matplotlib has an inbuilt defined func
  • java有哪些集合类型?集合类的特点

    Java属于入门容易 xff0c 天花板却极高的编程语言 java有哪些集合类型 对于java工程师来说技术的不断发展 需要不断学习java进阶知识 为了帮助大家巩固基础 xff0c 本文解答了java有哪些集合类型 集合类的特点是什么 x
  • MATLAB(一)基本操作与矩阵输入

    文章目录 前言一 Matlab视窗二 基本操作与矩阵输入1 把MATLAB当做计算机2 初等数学函数Exercise练习 2 嵌入函数3 特殊变量和常量4 MATLAB调用优先5 数字显示格式长Exercise练习 6 命令行终端7 部分函
  • MATLAB(六)图形界面_GUI_程式设计

    文章目录 前言MATLAB GUI Programs启动GUI程序对齐组件给按钮标上标签GUI脚本结构function untitled OpeningFcn对象的回调Set the axes for PlottingExercise练习P
  • Excel 精选28个技巧

    文章目录 前言1 一键求和2 一键插入柱形图3 单元格内强制换行4 快速移动资料5 快速生成下拉式功能表6 计算带单位的数据7 小写金额转大写8 快速输入 9 批量添加下划线10 文字随单元格大小变化11 图片随单元格大小变化12 快速提取
  • 调度算法——时间片轮转、优先级、多级反馈队列(例题详细!!!)

    文章目录 前言知识总览时间片轮转 xff08 RR Round Robin xff09 优先级调度算法多级反馈队列调度算法知识回顾与重要考点 前言 此篇文章是我在B站学习时所做的笔记 xff0c 大部分图片都是课件老师的PPT xff0c
  • 生产者-消费者问题(有例题!!!)

    文章目录 前言问题描述如何实现思考 xff1a 能否改变相邻P V操作的顺序 知识回顾与重要考点 前言 此篇文章是我在B站学习时所做的笔记 xff0c 大部分图片都是课件老师的PPT xff0c 方便复习用 此篇文章仅供学习参考 提示 xf
  • 计算机网络习题——循环冗余校验

    3 07 要发送的数据为1101011011 采用CRC的生成多项式是 P X 61 X 4 43 X 43 1 试求应添加在数据后面的余数 xff08 1 xff09 若要发送的数据在传输过程中最后一个1变成了0 xff0c 即变成了11
  • 计算机网络课后答案(谢希仁第八版)

    计算机网络课后答案 谢希仁第八版
  • linux系统 删除文件命令

    Linux系统下删除文件是一个非常高频的需求 xff0c 几乎每天都会遇到 xff0c 所以rm命令是一个非常常用Linux命令 rm命令是英文单词 remove 的缩写 xff0c 它主要作用是 xff1a 1 删除文件 xff1b 2
  • 常见的HTTP状态码列表

    HTTP状态码列表 状态码 状态码英文名称 中文描述 1xx xff08 信息性状态码 xff09 xff1a 请求已被接受 xff0c 需要继续处理 100 Continue 继续 客户端应继续其请求 101 Switching Prot
  • 二进制的加减法_二进制加减法

    二进制的加减法 1 二进制加法 1 Binary Addition Since binary numbers consist of only two digits 0 and 1 so their addition is different
  • SQL注入攻击方法

    SQL注入攻击是一种利用Web应用程序中存在的安全漏洞 xff0c 通过在输入框中插入恶意的SQL代码 xff0c 从而实现对数据库的非法操作 以下是一些常见的SQL注入攻击方法 xff1a 使用单引号 xff08 39 xff09 进行字
  • 利用Python+selenium技术,实现浏览器基本操作详解,代码有详细注释

    首先 xff0c 需要安装selenium库和对应的浏览器驱动程序 以Chrome浏览器为例 xff0c 可以使用以下命令安装selenium和chromedriver xff1a pip install selenium 然后 xff0c
  • &和&&的区别(简单易懂)

    amp xff08 按位与 xff09 和 amp amp xff08 逻辑与 xff09 的区别如下 xff1a 1 amp amp 具有短路功能 xff0c 而 amp 不具有短路功能 2 当 amp 运算符两侧的表达式的结果均为真时
  • Spring框架学习笔记

    一 什么是Spring框架 Spring框架是由于软件开发的复杂性而创建的 Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情 然而 xff0c Spring的用途不仅仅限于服务器端的开发 从简单性 可测试性和松耦

随机推荐

  • 人工智能——DBSCAN密度聚类(Python)

    目录 1 概述 1 1 概念 1 2 DBSCAN数据点分类 2 DBSCAN算法流程 2 1 DBSCAN算法流程 xff1a 2 2 举例 3 案例1 xff08 Python实现 xff09 3 1 案例 3 2 Python实现 3
  • @RequestMapping的参数和用法

    在Spring MVC 中使用 64 RequestMapping 来映射请求 xff0c 也就是通过它来指定控制器可以处理哪些URL请求 xff0c 相当于Servlet中在web xml中配置 源码 xff1a 该注解说明可以在类和方法
  • Linux 实验:记录型信号量 生产者-消费者问题详解

    进程同步问题是一个非常重要且相当有趣的问题 xff0c 因而吸引了很多学者对他进行研究 本文就选取其中较为代表性的生产者 消费者问题来进行学习 xff0c 以帮助我们更好的理解进程同步的概念及实现方法 一 问题描述 有一群生产者进程在生产产
  • Linux C语言线程解决生产者与消费者

    前言 生产者 消费者模式 xff0c 生产者这边负责生产产品 而消费者负责消费产品 xff0c 对于消费者来说 xff0c 没有产品的时候只能等待产品出来 xff0c 有产品就使用它 这里我们使用一个变量来表示这个这个产品 xff0c 生产
  • Mariadb

    文章目录 1 数据库的介绍2 mariadb的安装与开启3 软件基本信息4 数据库的安全初始化4 1 执行安全初始化脚本4 2 关闭数据库开放端口 5 数据库的基本管理5 1查看5 2新建5 3更改5 4备份与删除 6 数据库密码管理6 1
  • 【FPGA】按键消抖

    文章目录 一 按键消抖概述1 为何要进行按键消抖2 消抖的方式 二 系统设计1 系统模块划分2 系统时序图 三 代码实现1 按键消抖模块 xff08 key debounce xff09 2 呼吸灯模块 xff08 led breath x
  • java字符串添加字符_如何在Java中向字符串添加字符?

    java字符串添加字符 Case 1 In a simple way we will learn how to add characters by using predefined methods 情况1 xff1a 以简单的方式 xff0
  • 【Ubuntu18.04更换国内源及404错误解决办法】

    Ubuntu18 04 arm换源方法 及 404错误解决办法 换源将下面的任选一组源放入到上面的sources list中 xff0c 96 保存退出并更新即可 96 清华源阿里源中科大源 错误apt get update 后出现 404
  • 【Linux中QT加载.so库与调用Python】

    Linux中QT添加 so库与Python库 一 如何导入 so库1 1 不同系统中 库名称各有不同1 2 Linux中的QT导入库方法 xff1a 二 调用Python2 1 添加Python库2 2 创建Python文件 引入头文件2
  • QT连接SQLServer并添加ODBC数据源

    QT连接SQLServer并添加ODBC数据源 一 创建数据源1 打开ODBC数据源2 创建数据源3 测试数据源 二 QT连接SQLServer1 连接代码2 测试成功样图 一 创建数据源 1 打开ODBC数据源 在搜索框中进行搜索ODBC
  • QT生成exe独立运行文件

    目录 一 封装QT独立运行的 exe文件好处1 1 xff1a 封装软件 xff1a Enigma Virtual Box 9 901 2 xff1a 下载链接 xff1a 阿里云盘 https www aliyundrive com s
  • 【1期 QT之控件的创建与使用】

    前言 QT一开始在1991年被奇趣公司研发 xff0c 创建的目的就是实现GUI图形界面开发与非GUI的开发 后来被诺基亚收购了 xff0c 维护至今 当然在诺基亚手里也是越发展越好 好了QT就介绍这么多了 我们直接上干货 xff1a 我将
  • 【2期 QT信号与槽函数&回调函数与函数指针】

    前言 信号与槽函 xff1a 一对多 多对一 多对多 类似于C 43 43 设计模式中的观察者模式 信号与槽函数不是C 43 43 标准代码 xff0c 是QT特有的 xff0c 最终通过moc meta Object Complier 进
  • 关于约瑟夫环问题的思考(数组做法)

    这几天做题时碰见了一个很有意思的问题 xff0c 也是一个十分经典问题 约瑟夫环问题 问题很简单 xff0c 就是有n个人围成一个圈 xff0c 每隔m个人就自杀一个 xff0c 直到剩下最后一个人为止 xff0c 问最后剩下的最后一个人是
  • Windows Powershell相关(历史命令、命令)

    Powershell取证 历史命令 xff1a win10 powershell的命令历史记录存储在 span class token operator span USERPROFILE span class token operator
  • 符合ASTM标准的雨流计数法及其不同的改进方法

    随着研究的深入 xff0c 人们发现采用时间序列计算载荷谱太麻烦了 xff0c 处理的工作量太大 xff0c 我们不需要将每个时刻点的载荷都做运算 xff0c 疲劳计算只需要提供幅值 均值和循环次数 xff0c 鉴于此发展出了很多不同的计数
  • 对载荷谱进行雨流计数的几个主要步骤(以四点雨流计数为例)

    对载荷谱进行雨流计数的几个主要步骤 xff08 以四点雨流计数为例 xff09 滤除小幅值 Hysteresis Filtering 峰谷滤波 Peak Valley Filtering 离散化 Discretization 四点法雨流计数
  • bigdecimal乘法_Java BigDecimal乘法()方法与示例

    bigdecimal乘法 BigDecimal类的multiple 方法 BigDecimal Class multiply method Syntax 句法 xff1a public BigDecimal multiply BigDeci
  • 侯捷老师C++学习笔记——大气编程(上)

    本课程要有一点点C或C 43 43 的基础 xff0c 学习效果会更好哦 侯捷老师讲的特别通透 xff0c 听完收获很大 Lesson1 简介 课程基础 xff1a 曾经学过某种面向过程的编程语言 procedural language 知
  • 侯捷老师C++学习笔记——大气编程(下)

    侯捷老师C 43 43 课程下半部分 本课程是对之前课程中所提的一些东西的补充 xff0c 以及C 43 43 11新特性的一些讲解 Lesson1 介绍 本课程会讲的内容 xff1a 泛型编程深入探索面向对象继承关系所形成的的对象模型 x