C++ Primer Plus第八章笔记

news2025/2/23 18:31:14

内联函数

编译过程的目标是可执行程序(由一组机器语言指令组成)。运行程序时,操作系统将指令载入到计算机内存中,则每条指令都有其特定的内存地址

内联函数的编译代码与其它程序代码内联,编译器就使用相应的函数代码替换函数调用。

1.1 常规函数和内联函数

常规函数:调用使得程序调到另一个地址(函数的地址),并在函数结束时返回。

将程序流程转到独立的函数。

内联函数:程序无需跳到另一个位置处执行代码,再跳回来。

如果编译器认定可以设置为内联函数,在编译之前,就会将主调函数中调用该内联函数的位置,直接替换为该函数体的内容,再进行编译,这样就省去了运行时,调用函数的CPU开销

1.2 内联函数的优缺点

优点:运行速度比常规函数快。

缺点:占用内存大

1.3 使用内联函数的要求

  • 在函数 声明前 加上 关键字inline
  • 在函数 定义前 加上 关键字inline
  • 一般用法:省略原型,将整个定义(函数头和所有函数代码)放在本应提供原型的地方。
  • ⚠️注意点:内联函数不能递归,末尾不加分号(;)

2. 引用变量

引用:已定义变量的别名。

主要用途:用作 函数的形参。通过引用变量用作参数,函数将使用原始数据,而不是使用副本。

2.1 创建引用变量

C和C++中使用 地址符(&) 来指示变量的地址。用来声明引用。 (符号重载)

int rats;
int & rodents = rats; // &不是地址运算符,是类型标识符的一部分。

引用 必须在声明引用时将其初始化,而不是类似指针,先声明,再赋值。

引用更接近 const指针,必须在创建时进行初始化,变量关联后,就无法更改。

2.2 引用用作函数参数

引用传递:当引用被用作函数参数时,使得函数中的变量名成为调用程序中的变量的别名

允许被调用的函数能够访问调用函数中的变量。

按值传递:被调用函数使用调用程序的值的拷贝

C语言中改用按指针传递的方式避开按值传递的限制。

使用和访问原始数据的方法:按 引用传递 和 传递指针

当左值引用参数是 const时,会生成临时变量的两种情况:

左值参数:可被引用的数据对象。

  • 实参的类型正确,但不是左值。

  • 实参的类型不正确,但可转换为正确的类型。

尽可能使用const

  • 使用const可以避免无意中修改数据的编程错误

  • 使用const使函数能够处理const非const实参 ,否则只能接受非const数据

  • 使用const引用使函数能够正确生成并使用临时变量(如果实参引用参数不匹配,c++将生成临时变量)。

C++11 引入 右值引用,可指向右值,使用 && 来声明。

相关链接:C++引用_小梁今天敲代码了吗的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_43780415/article/details/128448823

2.3 结构引用

引用适合 结构和类(用户自定义类型,非基本的内置类型)。

引入引用的目的:用于用户自定义类型,而不是基本的内置类型。

使用 结构引用参数的方式 与基本变量引用 相同,只需在声明结构参数时使用 引用运算符& 即可。

2.5 对象、继承和引用

继承:将语言的特性从一个类 传递 给另一个类

继承的特征:派生来继承了基类的方法,基类引用可以指向派生类对象,而无需进行强制类型转换

ostream是基类

ofstream是派生类

2.6 何时使用引用参数

使用引用参数的两个主要原因

  • 程序员能修改调用函数中的数据对象。
  • 通过传递引用而不是整个数据对象,提高程序的运行速度。(当数据对象(结构和类对象)较大时很重要)

对于 使用传递的值 而 不作修改 的函数

  • 数据对象很小,如内置数据类型或小型结构按值传递
  • 数据对象是数组,则使用指针,因为这是唯一的选择,并将 指针声明为指向 const 的指针
  • 数据对象是较大的结构,则使用 const 指针或 const 引用,可以 节省复制结构所需的时间和空间
  • 数据对象是类对象,则使用 const 引用。传递类对象参数的标准方式是 按引用传递

对于修改调用函数中数据的函数

  • 数据对象是内置数据类型,则使用指针

  • 数据对象是数组,则只能使用指针

  • 数据对象是结构,则使用引用或指针

  • 数据对象是类对象,则使用引用

3. 默认参数

定义:指当函数调用中省略了实参时自动使用的一个值。

设置默认值的方法:通过函数原型将值赋给原型中的参数。例left() 原型:

char *left(const char *str,int n = 1);

对于带参数列表的函数,必须从右向左添加默认值(要为某个参数设置默认值,必须为其右边的所有参数提供默认值)。

int harpo(int n,int m = 4 , int j = 5); //VALID
int chico(int n ,int m = 6,int j); // INVALID

实参按 从左向右 的顺序依次被赋给相应的形参,而不能跳过任何参数。

beeps = harpo(3, ,8); // 不允许

 默认参数的好处减少要定义的析构函数、方法以及方法重载的数量*。

注意:只有原型指定了默认值,函数定义与没有默认参数时完全相同。

4. 函数重载(polymorphism)

  • 默认参数可以使用不同数目的参数调用同一个函数。
  • 术语多态(polymorphism) 指多种形式,函数多态允许函数使用多种形式。
  • 术语函数重载 指可以有多个同名的函数,则对名称进行重载。

函数多态(函数重载)可使用多个同名的函数。

函数重载的关键是函数的参数列表 ---> 函数特征标

C++允许定义名称相同的函数,条件是特征标不同

编译器在检查函数特征标时,将把类型引用和类型本身视为同一个特征标。

匹配函数时,不区分const 和非const变量

⚠️注意:真正让函数能够进行重载的是:特征标

何时使用函数重载?

函数重载不可滥用。仅当函数基本上执行相同的任务,但使用不同形式的数据时,才应采用函数重载。

相关链接:C++ 函数提高_小梁今天敲代码了吗的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_43780415/article/details/128460372

5. 函数模版

5.1 重载的模板

函数模板是通用的函数描述,使用泛型(可用具体的类型替换)来定义函数。所以也叫做通用编程

建立一个模板,关键字 template 和 typename 是必需,除非使用关键字class代替typename,必须使用 尖括号<>

template <typename T> /*C++98 标准时添加关键字 typename*/
template <class T> /*C++98之前使用class*/

Tips:如果需要多个将同一种算法用于不同类型的函数,请使用模板。如果不考虑向后兼容的问题,并愿意键入较长的单词,则声明类型参数时,应使用关键字typename而不是class

⚠️注意:函数模板不能缩短可执行程序。

模板重载和函数重载类似。

5.2 模板的局限性

模板函数也会有一些无法处理的某些类型。

template <class T> /*等于 template <typename T>*/
void f(T a,T b)
{
    a=b; /*如果T为数组时,假设不成立*/
    if(a > b) /*如果T为结构时,假设不成立*/
}

5.3 显式具体化

当编译器找到与函数调用匹配的具体化定义时,将使用该定义,而不再寻找模板。

C++98标准使用的方法

  • 对于给定的函数名,可以有非模板函数、模板函数和显式具体化模板函数以及他们的重载版本。
  • 显示具体化的原型和定义应以template<>打头,并通过名称来指出类型。
  • 具体化 优先于常规模板,而非模板函数优先于具体化常规模板

显式具体化的格式:

template <> void Swap<int>(int&,int&)

5.4 实例化和具体化

在代码中包含函数模板本身并不会生成函数定义,只是一个用于生成函数定义的方案。

隐式实例化:编译器在使用模板事会为特定类型生成函数定义时,即可实现模板实例。

显式实例化:直接告知编译器创建特定的实例。

/*语法:声明所需的类 ----> 用符号 <> 符号指示类型,并在声明前加上关键字template*/
template void Swap<int>(int,int); /*显式实例化*/

注意:显式具体化声明在关键字template后包含<>,而显式实例化没有。

不要试图在同一个文件(或转换单元)中使用同一种类型的显式实例和显式具体化,否则会出错。

隐式实例化显式实例化显式具体化统称为具体化

5.5 编译器选择使用哪个函数版本

重载解析:决定为函数调用使用哪一个函数定义的过程。

解析的过程

  • 创建候选函数列表,包含被调用函数名称相同的所有函数
  • 使用候选函数列表创建可执行函数列表,这些都是参数数目正确的函数,为此有一个隐式转换序列,其中包括实参类型和相应的形参类型完全匹配的情况。
  • 确定是否有最佳可执行函数,如果有则调用,没有则报错

在实际场景下,只考虑特征标,不考虑返回类型。

相关链接:C++模板_小梁今天敲代码了吗的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_43780415/article/details/130388222

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

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

相关文章

亚运之城:杭州的搞钱之王 首富都得靠边站

作者&#xff1a;积溪 简评&#xff1a;这届亚运会&#xff0c;杭州成了显眼包&#xff0c;也卷成了蚊香&#xff0c;这背后杭州的搞钱实力&#xff0c;究竟有多牛&#xff1f;#杭州亚运会 #马云 #阿里 手机可以“打”公交 10分钟就能到 还只要1块钱&#xff1f; 这届亚运…

数据分析方法-对比分析和用户画像(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

App Store上线规范及流程

上线一个应用到 App Store 需要遵循苹果的规范和流程&#xff0c;以确保应用的质量和安全性。以下是上线应用到 App Store 的一般规范和流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 开发和…

基于微信小程序的学生签到系统设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

ETHERCAT转ETHERCAT协议网关

JM-ECAT-ECAT 产品介绍 JM-ECAT-ECAT是自主研发的一款ETHERCAT从站功能的通讯网关。该产品主要功能是将2个ETHERCAT网络连接起来。 本网关连接到ETHERCAT总线中做为从站使用。 产品参数 技术参数 l 网关做为ETHERCAT网络的从站&#xff0c;可以连接倍福、欧姆龙、基恩士等厂…

带你深入学习Redis主从复制,学习心跳包、主从结构,全量复制、部分复制等

目录 1、单点问题 2、理解主从复制 3、配置Redis主从结构 3.1、在一个云服务器上如何启动多个Redis服务器&#xff1a; 3.2、配置主从复制 3.3、查看是否配置成功 3.4、补充&#xff1a;redis服务器启动和停止的命令&#xff0c;需要搭配使用 3.5、查看主从结构信息 3…

源码级揭秘Linux内核启动流程

哈喽&#xff0c;我是子牙&#xff0c;一个很卷的硬核男人。深入研究计算机底层、Windows内核、Linux内核、Hotspot源码……聚焦做那些大家想学没地方学的课程 今天这篇文章给大家分享一下Linux内核的启动流程。为什么要分享这个话题呢&#xff1f;所谓万丈高楼平地起&#xf…

可口可乐用新的“Y3000”口味拥抱有争议的人工智能图像生成器

可口可乐公司已经迈出了一大步&#xff0c;用它的释放&#xff1b;排放&#xff1b;发布据报道&#xff0c;可口可乐Y3000零糖“限量版”饮料是与人工智能共同创造的。它未来的名字让人想起3000年的味道(还有977年)&#xff0c;但它的营销依赖于人工智能从2023年产生的图像——…

Vue之路由及Node.js环境搭建(一起探索新事物)

目录 ​编辑 前言 一、Vue之路由 1.路由简介 1.1 什么是路由 1.2 什么是SPA 1.3 SPA的实现思路 1.4 使用路由的优势 2. 案例演示 2.1 导入所需的js文件 2.2 编写案例代码&#xff08;模拟页面跳转&#xff09; 二、Vue之node.js 1. node.js简介 1.1 什么是node.j…

玫瑰代码||逐字打印字体||中秋快乐

关注微信公众号「ClassmateJie」 更多惊喜等待你的发掘 直接看实现效果 电脑端 手机端 使用场景 发给女神告白~ 提供一些文案 “自从遇见你&#xff0c;我的世界变得不一样了。每一天都因为你而变得特别。我想告诉你&#xff0c;我喜欢你&#xff0c;不仅仅是因为你的美丽&am…

使用 PyTorch 的计算机视觉简介 (2/6)

一、说明 在本单元中&#xff0c;我们从最简单的图像分类方法开始——一个全连接的神经网络&#xff0c;也称为感知器。我们将回顾一下 PyTorch 中定义神经网络的方式&#xff0c;以及训练算法的工作原理。 二、数据加载的实践 首先&#xff0c;我们使用 pytorchcv 助手来加载…

民安智库(第三方市场调查公司)开展景区游客满意度调查

为什么要开展景区游客满意度调查 景区的经营管理是一个动态的过程&#xff0c;需要不定期的地进行调查&#xff0c;让管理者了解景区管理的不足之处&#xff0c;并不断地改善和提高管理水平&#xff0c;以保证经营目标的顺利完成。 景区旅游要想真正地成为可持续发展的经济产…

人类的生成式与机器的生成式

生成式是指一种基于模型的方法&#xff0c;通过给定的条件或输入&#xff0c;生成与之相符合的输出。在自然语言处理领域中&#xff0c;生成式模型通常用于生成文本、文章、对话等自然语言序列。 生成式模型的训练主要涉及两个步骤&#xff1a;学习和生成。在学习阶段&#xff…

【每日一题】2603. 收集树中金币

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;拓扑排序 写在最后 Tag 【拓扑排序】【树】 题目来源 2603. 收集树中金币 题目解读 有一个有 n 个节点的无相无根图&#xff0c;节点编号从 0 到 n-1。有一个表示图中节点间连接关系的数组 edges&#xff0c;长度为 …

目前最流行的无人机摄影测量软件有哪些?各有什么特点?

文章目录 1. Pix4Dmapper2. PhotoScan3. ContextCapture4. 天工GodWork5. Trimble Inpho6. IMAGINE Photogrammetry7. 大疆智图 推荐阅读&#xff1a;《无人机航空摄影测量精品教程》 包括&#xff1a;无人机航测外业作业流程&#xff08;像控点布设、航线规划、仿地飞行、航拍…

滚雪球学Java(30):多维数组:定义和初始化一次搞定

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

高精度PWM脉宽调制信号转模拟信号隔离变送器1Hz~10KHz转0-5V/0-10V/1-5V/0-10mA/0-20mA/4-20mA

主要特性: >>精度等级&#xff1a;0.1级。产品出厂前已检验校正&#xff0c;用户可以直接使用 >>辅助电源&#xff1a;8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号&#xff1a;0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…

spring boot 八、 sharding-jdbc 分库分表 按月分表

在项目resources目录下新建com.jianmu.config.sharding.DateShardingAlgorithm 文件 新增yaml配置 数据源 spring:shardingsphere:props:sql:#是否在日志中打印 SQLshow: true#打印简单风格的 SQLsimple: truedatasource:names: pingxuanlogpingxuanlog:type: com.alibaba.dru…

【20230921】关于sing-box命令行程序开机自启动运行(Windows、Linux)

1 背景 sing-box是一个命令行程序&#xff0c;官网给出的教程是复制链接到Git Bash&#xff08;windows&#xff09;或终端运行&#xff08;Linux&#xff09;。每次开机都进行复制运行是一件繁琐的事情。 复制的内容其实就是下次并运行shell脚本&#xff0c;其实系统只需要运…

在线旅游平台步入新时代,携程如何走出自己的路?

今年旅游从线下到线上全方位火了。有统计数据&#xff0c;一季度&#xff0c;光是抖音&#xff0c;旅游达人发布视频数量就高达175万条&#xff0c;播放量1350亿次&#xff0c;收获27亿次点赞。在这一趋势下&#xff0c;许多“不出名”的景区和酒店借势抖音达人完成“出圈”。短…