《C++ Primer Plus》学习笔记|第8章 函数探幽 (24-11-30更新)

文章目录

  • 8.1 内联函数
  • 8.2 引用变量
    • 8.2.1 创建引用变量
    • 8.2.2 将引用用作函数参数
    • 8.2.3 引用的属性和特别之处
      • 特点1:在计算过程中,传入的形参的值也被改变了。
      • 特点2:使用引用的函数参数只接受变量,而不接受变量与数值的运算
      • 左值引用
      • 右值引用
    • 8.2.4 将引用用于结构
  • 8.3 默认参数
  • 8.4 函数重载
  • 8.5 函数模版
    • 8.5.1 重载的模板

8.1 内联函数

内联函数是C++为提高程序运行速度所做的一项改进。
常规函数和内联函数之间的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中。

常规函数是要跳跃到新的函数进行处理,而内联函数是用函数代码替换函数调用。

编译器将使用相应的函数代码替换函数调用。内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存

![[内联函数与常规函数.png|621]]

要使用内联函数特性,必须采取下述措施之一:

  • 在函数声明前加上关键字inline;
  • 在函数定义前加上关键字inline。

8.2 引用变量

8.2.1 创建引用变量

引用变量是C++新增的一种复合类型。

引用变量的创建:

int rats;
int & rodents =rats;

上述语句中的&运算符不是地址运算符,而是将rodents的 类型声明为int &,即指向int变量的引用。
但是下面语句中的&表示的是变量的地址

Cout << rodents address = &rodents << endl

引用还是不同于指针的。除了表示法不同外,还有其他的差别。例如,差别之一是, 必须在声明引用时将其初始化,而不能像指针那样,先声明,再赋值。
引用更接近const指针,必须在创建时进行初始化,一旦与某个变量关联起来,就将一直效忠于它。

8.2.2 将引用用作函数参数

![[图8.2 按值传递和按引用传递.png|477]]

对于交换两个变量的值,使用值传递无法成功,因为值传递无法改变两个值本身的内容。而使用引用或者指针来传递,是可以成功的。

8.2.3 引用的属性和特别之处

特点1:在计算过程中,传入的形参的值也被改变了。

如果程序员的意图是让函数使用传递给它的信息,而不对这些信息进行修改,同时又想使用引用,则应使用常量引用。应在函数原型和函数头中使用const:

double refcube(const double &ra);

特点2:使用引用的函数参数只接受变量,而不接受变量与数值的运算

double cube(double a){
a *= a * a;
return a;
}

double refcube(double &ra){
ra *= ra * ra;
return ra;
}

对于参数传递,以下使用值传递的方式的函数调用合法:

double z=cube(x+2.0);

以下使用引用传递的方式非法,在现代编译器中会报错:

double z=refcube(x+3.0);

这种非法的方式在早期的C++编译器中只会产生警告,编译器会生成临时的无名变量,并将其初始化为表达式x + 3.0的值。

左值引用

左值:左值参数是可被引用的数据对象,例如,变量、数组元素、结构成员、引用和解除引用的指针都是左值。
通过&符号来创建左值引用

例如,int a = 10; int& ref = a;,这里ref就是a的左值引用,它和a指向同一块内存地址。

右值引用

右值:临时对象、即将消亡的值
在 C++ 11 中引入,通过&&符号来创建右值引用。

例如,int&& rref = 10;,这里 10 是一个右值(临时的整数常量),rref是它的右值引用。

8.2.4 将引用用于结构

8.3 默认参数

默认参数指的是当函数调用中省略了实参时自动使用的一个值。

使用默认值的方法,通过函数原型:

char *left(const char*str,intn=1);

实参和形参(默认值)赋予值的方向相反。对于带参数列表的函数,必须从右向左添加默认值。而实参按从左到右的顺序依次被赋给相应的形参

int harpo(int n,int m=4,int j=5);
int chico(int n,int m=6,int j);  //Invalid
int groucho(int k=1:int m=2:int n=3);
beeps = harpo(2);
beeps = harpo(1,8);
beeps = harpo(8,7,6);

8.4 函数重载

=函数多态:函数在接收到不同类型的值之后的不同反应

函数重载的关键是函数的参数列表——也称为函数特征标(function signature)

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

double cube(double x);
double cube(double &x);

是特征标,而不是函数类型使得可以对函数进行重载。例如,下面的两个声明是互斥的:

long gronk(int n,float m);
double gronk(int n,float m);

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

8.5 函数模版

建立一个交换模板:

template <typename AnyType>
void Swap(AnyType &a,anyType &b){
	AnyType temp;
	temp = a;
	a = b;
	b = temp;
}

关键字template和typename是必需的,除非可以使用关键字class代替typename。 另外,必须使用尖括号。

8.5.1 重载的模板

示例(函数声明):

template<typename T>  //original template
void Swap(T &a,T &b);  

template <typename T>  //new template
void Swap(T *a,T *b,int n):

一个是对两个int值的交换,另一个是对两个数组的交换

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[2024年1月28日]第15届蓝桥杯青少组stema选拔赛C++中高级(第二子卷、编程题(1))

参考程序&#xff1a; #include <iostream> #include <algorithm> // 用于 std::sortusing namespace std;int main() {int a, b, c;cin >> a >> b >> c;// 将三个数放入一个数组中int arr[3] {a, b, c};// 对数组进行排序sort(arr, arr 3);…

基于hexo框架的博客搭建流程

这篇博文讲一讲hexo博客的搭建及文章管理&#xff0c;也算是我对于暑假的一个交代 &#xff01;&#xff01;&#xff01;注意&#xff1a;下面的操作是基于你已经安装了node.js和git的前提下进行的&#xff0c;并且拥有github账号 创建一个blog目录 在磁盘任意位置创建一个…

基于Java Springboot传统戏曲推广微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

数据结构--树二叉树顺序结构存储的二叉树(堆)

前言 前面我们学习了顺序表、链表、栈和队列&#xff0c;这些都是线性的数据结构。今天我们要来学习一种非线性的数据结构——树。 树的概念及结构 树的概念 树是一种非线性的数据结构&#xff0c;是由n&#xff08;n≥0&#xff09;个有效结点组成的一个具有层次关系的集合…

网络安全运行与维护 加固练习题

1. 提交用户密码的最小长度要求。 输入代码: cat /etc/pam.d/common-password 提交答案: flag{20} 2.提交iptables配置以允许10.0.0.0/24网段访问22端口的命令。 输入代码: iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 22 -j ACCEPT 提交答案: flag{iptables -A I…

【汇编语言】call 和 ret 指令(三) —— 深度解析汇编语言中的批量数据传递与寄存器冲突

文章目录 前言1. 批量数据的传递1.1 存在的问题1.2 如何解决这个问题1.3 示例演示1.3.1 问题说明1.3.2 程序实现 2. 寄存器冲突问题的引入2.1 问题引入2.2 分析与解决问题2.2.1 字符串定义方式2.2.2 分析子程序功能2.2.3 得到子程序代码 2.3 子程序的应用2.3.1 示例12.3.2 示例…

Java 泛型详细解析

泛型的定义 泛型类的定义 下面定义了一个泛型类 Pair&#xff0c;它有一个泛型参数 T。 public class Pair<T> {private T start;private T end; }实际使用的时候就可以给这个 T 指定任何实际的类型&#xff0c;比如下面所示&#xff0c;就指定了实际类型为 LocalDate…

Python语法基础(四)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 高阶函数之map 高阶函数就是说&#xff0c;A函数作为B函数的参数&#xff0c;B函数就是高阶函数 map&#xff1a;映射 map(func,iterable) 这个是map的基本语法&#xff0c;…

【JavaEE初阶】应是天仙狂醉,乱把白云揉碎 - (重点)线程

本篇博客给大家带来的是线程的知识点, 由于内容较多分几天来写. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ⭐欢迎大家点赞 评论 收藏 分享 ❤❤❤ 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 1. 认识线程 1.1 概念 )1 …

构建鸿蒙5.0应用(一)

准备工作 1、开发工具 开发工具使用华为官方推荐的IDE&#xff1a;DevEco Studio &#xff0c;为鸿蒙应用开发提供了最全面的官方支持&#xff0c;包括最新的 SDK、API 和功能。 2、编译工具 开发鸿蒙应用需要安装Nodejs环境&#xff0c;为打包编译鸿蒙应用提供支持&#x…

【Linux】匿名管道通信场景——进程池

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…

FUSU: 多源多时相土地利用变化分割数据集

FUSU是首个针对细粒度城市语义理解的多时态、多源地类变化分割数据集&#xff0c;其提供高分辨率双时态图像和每月时序观测&#xff0c;支持对城市动态变化的高频率监测。FUSU-Net是统一的时序架构&#xff0c;可同时进行变化检测和分割任务。结合光学和SAR数据&#xff0c;通过…

LLM学习笔记(13)分词器 tokenizer

由于神经网络模型不能直接处理文本&#xff0c;因此我们需要先将文本转换为数字&#xff0c;这个过程被称为编码 (Encoding)&#xff0c;其包含两个步骤&#xff1a; 使用分词器 (tokenizer) 将文本按词、子词、字符切分为 tokens&#xff1b;将所有的 token 映射到对应的 tok…

Unity中让光点跟图片填充区的末尾一起移动

一、实现效果展示 想要实现的效果如下,就是要让白色光点图片跟随绿色圆形图片填充区末尾一起移动。 二、代码如下: using UnityEngine; using System.Collections; using UnityEngine.UI; using DG.Tweening;public class IconCircle : MonoBehaviour {public float ti…

给定一个整数可能为正,0,负数,统计这个数据的位数.

题目描述 给定一个整数可能为正,0,负数,统计这个数据的位数. 例如1234567输出7位; -12345678输出8位;0输出1位 代码实现 int main() { long long m; long long n; scanf("%lld",&n); mn; int count0;//位数 do { count; n/10;//舍弃个位 }while(n!0); printf(&…

LLamafactory API部署与使用异步方式 API 调用优化大模型推理效率

文章目录 背景介绍第三方大模型API 介绍LLamafactory 部署API大模型 API 调用工具类项目开源 背景介绍 第三方大模型API 目前&#xff0c;市面上有许多第三方大模型 API 服务提供商&#xff0c;通过 API 接口向用户提供多样化的服务。这些平台不仅能提供更多类别和类型的模型…

【关闭or开启电脑自带的数字键盘】

目录 一、按数字键盘左上角的按键【NumLK Scroll】 二、修改注册表中数字键盘对应的数值【InitialKeyboardIndicators】 1、步骤&#xff1a; 2、知识点&#xff1a; 一、按数字键盘左上角的按键【NumLK Scroll】 这是最简单快捷的方法。 关闭后若想开启&#xff0c;再按一…

【FAQ】使用Node.js 镜像 构建本地项目

在nodejs官方并没有提供使用node.js构建本地项目的方法&#xff0c;但是通过阅读官方文档&#xff0c;可以发现&#xff0c;官方在包管理器界面提供了如下语句 所以node.js容器是可以执行语句的 下面通过docker 的 -w 、-v 参数设置容器工作目录和目录映射&#xff08;实现本…

深度学习 | pytorch + torchvision + python 版本对应及环境安装

Hi&#xff0c;大家好&#xff0c;我是半亩花海。要让一个基于 torch 框架开发的深度学习模型正确运行起来&#xff0c;配置环境是个重要的问题&#xff0c;本文介绍了 pytorch、torchvision、torchaudio 及 python 的对应版本以及环境安装的相关流程。 目录 一、版本对应 二…

4399大数据面试题及参考答案(数据分析和数据开发)

对数据分析的理解 数据分析是一个从数据中提取有价值信息以支持决策的过程。它涵盖了数据收集、清洗、转换、建模和可视化等多个环节。 首先&#xff0c;数据收集是基础。这包括从各种数据源获取数据&#xff0c;例如数据库、文件系统、网络接口等。这些数据源可以是结构化的数…