C++ Primer Plus第五版笔记(p201-250)

第六章 函数(下)

  1. 在含有return语句的循环后面应该也有一条return语句

  2. 不要返回局部对象的引用或指针,当函数结束时临时对象占用的空间也就随之释放掉了,所以两条return语句都指向了不再可用的内存空间。

  3. 如果函数返回指针、引用或类的对象,我们就能使用函数调用的结果访问结果对象的成员。

  4. 我们能为返回类型是非常量引用的函数的结果赋值

  5. C++11新标准规定,函数可以返回花括号包围的值的列表

  6. 如果函数返回的是内置类型,则花括号包围的列表最多包含一个值
    在这里插入图片描述

  7. 如果控制到达了main 函数的结尾处而且没有return语句,编译器将隐式地插入一条返回0的return语句

  8. 因为数组不能被拷贝,所以函数不能返回数组。

  9. 我们把函数的返回类型放在了形参列表之后,所以可以清楚地看到func函数返回的是一个指针,并目该指针指向了含有10个数的数组。

     auto func(int i) -> int(*)[10]
    
  10. 不允许两个函数除了返回类型外其他所有的要素都相同。

  11. 一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来;另一方面,如果形参是某种类型的指针或引用,则通过区分其指向的是常量对象还是非常量对象可以实现函数重载,此时的const是底层的
    在这里插入图片描述

  12. 重载对作用域的一般性质并没有什么改变:如果我们在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体。在不同的作用域中无法重载函数名

  13. 一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。

  14. 尽量让不怎么使用默认值的形参出现在前面,而让那些经常使用默认值的形参出现在后面。

  15. 局部变量不能作为默认实参。除此之外,只要表达式的类型能转换成形参所需的类型,该表达式就能作为默认实参

  16. 一般来说,内联机制用于优化规模较小、流程直接、频繁调用的函数

  17. constexpr函数的返回类型及所有形参的类型都得是字面值类型,而且函数体中必须有且只有一条return语句

  18. 和其他函数不一样,内联函数和constexpr函数可以在程序中多次定义(头文件)

  19. 当应用程序编写完成准备发布时,要先屏蔽掉调试代码。这种方法用到两项预处理功能:assert和NDEBUG。

  20. assert是一种预处理宏(preprocessor marco) 首先对 expr 求值,如果表达式为假(即0),assert输出信息并终止程序的执行。如果表达式为真(即非0),assert什么也不做。

  21. assert 宏定义在cassert头文件中。如我们所知,预处理名字由预处理器而非编译器管理

  22. assert的行为依赖于一个名为NDEBUG的预处理变量的状态。如果定义了NDEBUG,则assert什么也不做。默认状态下没有定义NDEBUG,此时 assert 将执行运行时检查。

  23. 我们使用变量输出当前调试的函数的名字。编译器为每个函func数都定义了__func__,它是const char 的一个静态数组,用于存放函数的名字
    在这里插入图片描述

在这里插入图片描述

  1. 我们无法把 const 对象、字面值常量或者需要进行类型转换的对象传递给普通的引用形参

  2. 当我们想把数组作为函数的形参时,有三种可供选择的方式:一是声明为指针,二是声明为不限维度的数组,三是声明为维度确定的数组。实际上,因为数组传入函数时实参自动转换成指向数组首元素的指针,所以这三种方式是等价的

在这里插入图片描述

  1. 引用类型的优势主要是可以直接操作所引用的对象以及避免拷贝较为复杂的类类型对象和容器对象。因为 initializer list 对象的元素永远 是常量值,所以我们不可能通过设定引用类型来更改循环控制变量的内容。只有当initializer list对象的元素类型是类类型或容器类型(比如string)时,才有必要把范围 for 循环的循环控制变量设为引用类型。

  2. 如果引用所引的是函数开始之前就已经存在的对象,则返回该引用是有效的:如果引用所引的是函数的局部变量,则随着函数结束局部变量也失效了,此时返回的引用无效。
    当不希望返回的对象被修改时,返回对常量的引用

  3. 函数指针
    在这里插入图片描述
    在这里插入图片描述

第七章 类 (上)

  1. 类的基本思想是数据抽象(data abstraction)和封装(encapsulation)。数据抽象是种依赖于接口(interface)和实现(implementation)分离的编程(以及设计)技术。类的接口包括用户所能执行的操作:
  2. 类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。
  3. 成员函数的声明必须在类的内部,它的定义则既可以在类的内部也可以在类的外部。作为接口组成部分的非成员函数,例如add、read和print等,它们的定义和声明都在类的外部。
  4. 成员函数通过一个名为this的额外的隐式参数来访问调用它的那个对象在这里插入图片描述
  5. 因为 this 的目的总是指向“这个”对象,所以 this 是一个常量指针,我们不允许改变this中保存的地址。
  6. C++语言的做法是允许把const 关键字放在成员函数的参数列表之后,此时,紧跟在参数列表后面的const表示this是一个指向常量的指针。像这样使用const的成员函数被称作常量成员函数
  7. 常量对象,以及常量对象的引用或指针都只能调用常量成员函数
  8. 类本身就是一个作用域
  9. 编译器分两步处理类:首先编译成员的声明,然后才轮到成员函数体(如果有的话)。
  10. 我们无须使用隐式的this指针访问函数调用者的某个具体成员,而是需要把调用函数的对象当成一个整体来访问
  11. 一般来说,如果非成员函数是类接口的组成部分,则这些函数的声明应该与类在同一个头文件内。
  12. 第一点,read和print分别接受一个各自10类型的引用作为其参数,这是因为I0类属于不能被拷贝的类型,因此我们只能通过引用来传递它们
  13. 一般来说,执行输出任务的函数应该尽量减少对格式的控制,这样可以确保由用户代码来决定是否换行。
  14. 我们用1hs的副本来初始化sum。默认情况下,拷贝类的对象其实拷贝的是对象的数据成员
  15. 无论何时只要类的对象被创建,就会执行构造函数。
  16. 构造函数的名字和类名相同。和其他函数不一样的是,构造函数没有返回类型;除此之外类似于其他的函数,构造函数也有一个(可能为空的)参数列表和一个(可能为空的)函数体
  17. 当我们创建类的一个const对象时,直到构造函数完成初始化过程,对象才能真正取得其“常量”属性。因此,构造函数在const对象的构造过程中可以向其写值。
  18. 如果我们的类没有显式地定义构造函数,那么编译器就会为我们隐式地定义一个默认构造函数
  19. 因此,含有内置类型或复合类型成员的类应该在类的内部初始化这些成员,或者定义一个自己的默认构造函数
  20. 我们把新出现的部分称为构造函数初始值列表(constructorinitialize list),它负责为新创建的对象的一个或几个数据成员赋初值。构造函数初始值是成员名字的一个列表,每个名字后面紧跟括号括起来的(或者在花括号内的)成员初始值
  21. 当某个数据成员被构造函数初始值列表忽略时,它将以与合成默认构造函数相同的方式隐式初始化
  22. 构造函数不应该轻易覆盖掉类内的初始值,除非新赋的值与原值不同。如果你不能使用类内初始值,则所有构造函数都应该显式地初始化每个内置类型的成员。
  23. 与其他几个构造函数不同,以istream 为参数的构造函数需要执行一些实际的操作。
  24. 当我们在类的外部定义构造函数时,必须指明该构造函数是哪个类的成员
  25. 管理动态内存的类通常不能依赖于上述操作的合成版本
  26. 不过值得注意的是,很多需要动态内存的类能(而且应该)使用vector对象或者string对象管理必要的存储空间。使用vector或者string的类能避免分配和释放内存带来的复杂性。
  27. struct和class的默认访问权限不太一样:如果我们使用struct关键字,则定义在第一个访问说明符之前的成员是public的:相反,如果我们使用class关键字,则这些成员是private的。出于统一编程风格的考虑,当我们希望定义的类的所有成员是public的时,使用struct;反之,如果希望成员是private的,使用class。
  28. 类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或者函数成为它的友元(friend)
  29. 友元声明只能出现在类定义的内部,但是在类内出现的具体位置不限
  30. 友元的声明仅仅指定了访问的权限,而非一个通常意义上的函数声明。如果我们希望类的用户能够调用某个友元函数,那么我们就必须在友元声明之外再专门对函数进行一次声明。
  31. 为了使友元对类的用户可见,我们通常把友元的声明与类本身放置在同一个头文件中(类的外部)。
  32. 一些编译器允许在尚无友元函数的初始声明的情况下就调用它。不过即使你的编译器支持这种行为,最好还是提供一个独立的函数声明。这样即使你更换了一个有这种强制要求的编译器,也不必改变代码
  33. 类还可以自定义某种类型在类中的别名
  34. 用来定义类型的成员必须先定义后使用,这一点与普通成员有所区别
  35. 定义在类内部的成员函数是自动inline的
  36. 我们可以在类的内部把inline作为声明的一部分显式地声明成员函数,同样的,也能在类的外部用inline关键字修饰函数的定义
  37. 虽然我们无须在声明和定义的地方同时说明inline,但这么做其实是合法的。不过,最好只在类外部定义的地方说明inline,这样可以使类更容易理解。
  38. 可变数据成员(mutable data member)永远不会是const,即使它是const对象的成员。因此,const成员函数可以改变一个可变成员的值。
  39. 当我们提供一个类内初始值时,必须以符号=或者花括号表示
  40. 一个 const 成员函数如果以引用的形式返回*this,那么它的返回类型将是常量引用
  41. 非常量版本的函数对于常量对象是不可用的,所以我们只能在一个常量对象上调用const成员函数。另一方面,虽然可以在非常量对象上调用常量版本或非常量版本,但显然此时非常量版本是一个更好的匹配。
  42. 在这里插入图片描述
  43. 即使两个类的成员列表完全一致,它们也是不同的类型。对于一个类来说,它的成员和其他任何类(或者任何其他作用域)的成员都不是一回事儿。
  44. 不完全类型只能在非常有限的情景下使用:可以定义指
  45. 类还可以把其他的类定义成友元,也可以把其他类(之前已定义过的)的成员函数定义成友元。此外,友元函数能定义在类的内部,这样的函数是隐式内联的。向这种类型的指针或引用,也可以声明(但是不能定义)以不完全类型作为参数或者返回类型的函数。

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

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

相关文章

排序(2)【选择排序】【快速排序】

一.选择排序 选择排序就是选择一个数组的最大的数字或者最小的数字,放在一整个数组的最后或者开头的位置。 1.选择排序的实现 我们可以对选择排序进行一些加强,普通的选择排序是选择最小的数,然后进行交换。这个加强之后就是我们既要选择出…

从ES的JVM配置起步思考JVM常见参数优化

目录 一、真实查看参数 (一)-XX:PrintCommandLineFlags (二)-XX:PrintFlagsFinal 二、堆空间的配置 (一)默认配置 (二)配置Elasticsearch堆内存时,将初始大小设置为…

ElasticSearch + kibana:类型声明

当我们使用 kibana 创建索引时,如果不申明数据类型,默认字符串赋予 text类型,如下图所示 接下来我们继续创建多条数据如下: 下面我们来检索下: 通过以上两个案例我们发现,使用 match 模糊查询 li-3 明明…

别再问别人了,这是小白都能懂的拓扑图指南

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 上午好,我的网工朋友。 老杨的网工交流群里经常会有这种现象: 一群小伙伴在问各类型拓扑图的问题,怎么设计&…

monitor-zabbix

监控体系理论 学习本篇文章,了解运维监控系统的前世今生 zabbix官网仓库地址 zabbix官网 https://www.zabbix.com/cn/zabbix官网仓库地址 http://repo.zabbix.com/zabbix/ http://repo.zabbix.com/zabbix/4.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_…

Hi3861 OpenHarmony嵌入式应用入门--基于HI-12F开发板烧写程序

首先需要一个开发板,我已经在嘉立创上进行了开源,基于安信可hi-12f模块的开发板,集成了两个按键,一个三色灯,一个滑动变阻器,可外接一个0.96寸液晶。 【HI-12F】基于安信可hi-12f模块的开发板 - 嘉立创EDA…

借助Aspose.Email,使用 C# .NET 创建 PST 文件并填充内容

PST(个人存储表)文件是管理 Outlook 数据的重要组成部分,方便存储电子邮件、联系人、日历和其他项目。在 C# .NET 开发领域,创建和管理存储文件的过程对于各种应用程序至关重要。 在本文中,我们将探讨如何使用 C# .NE…

内窥镜窄带光

文章目录 NBI相关信息 NBI相关信息 第一不知道哪家有这个技术? 第二直接搜索找不到相关信息 第三只能搜企业官网 搜集到的与NBI,相关的信息如下 英美达医疗公司 https://www.innermed.com/index.php/gongsixinwen/139.html 新光维医疗公司 官网页面…

【Spring】1. Maven项目管理

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更…

【无标题】Pycharm执行报错

file 读取未指定utf-8编码,加上就好了 疑问:为什么 有的电脑可以直接跑呢?该电脑、Pycharm、工程,已经做了修改设置默认值,但是到新的电脑上,就需要重新设置,所以 file 读、写,最好…

鸿蒙轻内核调测-内存调测-内存泄漏检测

1、基础概念 内存泄漏检测机制作为内核的可选功能,用于辅助定位动态内存泄漏问题。开启该功能,动态内存机制会自动记录申请内存时的函数调用关系(下文简称LR)。如果出现泄漏,就可以利用这些记录的信息,找到…

程序员日志之计算机相关专业还值得选择吗?

目录 传送门正文日志1、概要2、专业选择2.1、专业2.2、学校2.3、城市 3、计算机相关专业还值得选择吗? 传送门 SpringMVC的源码解析(精品) Spring6的源码解析(精品) SpringBoot3框架(精品) MyB…

中华老字号李良济,展现百年匠心之魅力,释放千年中医药文化自信

6月14-16日,“潮品老字号 国货LU锋芒”江苏老字号博览会在南京隆重启幕,中华老字号李良济凭借过硬的品牌实力和优质的口碑再次受邀参加,并在展会上绽放百年匠心魅力,彰显千年中医药文化自信! 百年匠心 以实力铸就荣耀…

计算机组成原理之定点乘法运算

文章目录 原码并行乘法与补码并行乘法原码算法运算规则存在的问题带符号的阵列乘法器习题原码阵列乘法器间接补码阵列乘法器直接补码阵列乘法器 补码与真值的转换 原码并行乘法与补码并行乘法 原码算法运算规则 存在的问题 理解流水式阵列乘法器(并行乘法器&#x…

Java环境安装

下载JDK https://www.oracle.com/cn/java/technologies/downloads/#jdk22-windows 点开那个下载都可以但是要记住下载的路径因为下一步要添加环境变量 选择编辑系统环境变量 点击环境变量 点击新建 新建环境变量JAVA_HOME 并输入JDK在计算机保存的路径 打开cmd 输入java -…

GStreamer——教程——基础教程4:Time management

基础教程4:Time management(时间管理) 目标 本教程展示了如何使用GStreamer时间相关工具。特别是: 如何查询管道以获取流位置或持续时间等信息。如何寻找(跳转)到流内的不同位置(时间&#x…

数据结构与算法笔记:基础篇 -递归树:如何借助树来求解递归算法的时间复杂度?

概述 我们都知道,递归代码的时间复杂度分析起来很麻烦。在《排序(下)》哪里讲过,如何用递推公式,求解归并排序、快速排序的时间复杂度,但是有些情况,比如快排的平均时间复杂度的分析,用递推公式的话&#…

《天软股票特色因子定期报告》

最新《天软股票特色因子定期报告》(2024-06),抢先发布 内容概要如下: 天软特色因子A08006(近一月日度买卖压力2)从行业角度分析,在电子设备、石油石化行业表现稳定,无论在有效性、区…

复星杏脉算法面经2024年5月16日面试

复星杏脉算法面经2024年5月 面试记录:3个部分1. 自己介绍 2. 问八股 3.代码题先自我介绍20分钟问问题1. 梯度爆炸怎么解决,三个解决方案:梯度裁剪(Gradient Clipping)正则化(Regularization)调整…

nginx+tomcat+nfs →web集群部署

nginxtomcatnfs →web集群部署 一.安装前介绍 NGINX是一个高性能的Web服务器和反向代理服务器。它能够处理静态内容,缓存请求结果,以及将请求转发给后端服务器。通过反向代理,NGINX能够实现请求的负载均衡、安全性增强、SSL加密等功能。此外…