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

news2025/1/9 14:55:25

文章目录

  • 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值的交换,另一个是对两个数组的交换

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

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

相关文章

在 Mac ARM 架构(例如 M1 或 M2 芯片)上安装 Node.js

文章目录 方法一&#xff1a;使用 Homebrew 安装 Node.js方法二&#xff1a;使用 Node Version Manager (NVM) 安装 Node.js方法三&#xff1a;从 Node.js 官方网站下载安装包注意事项 在 Mac ARM 架构&#xff08;例如 M1 或 M2 芯片&#xff09;上安装 Node.js 可以通过几种不…

电脑提示报错“Directx error”怎么解决?是什么原因导致的?游戏软件提示“Directx error”错误的解决方案

DirectX Error&#xff08;DX错误&#xff09;通常指的是在使用基于DirectX技术的应用程序&#xff08;尤其是游戏&#xff09;时遇到的问题。这个问题可能由多种因素导致&#xff0c;以下是一些可能的原因及相应的解决方案&#xff1a; 可能的原因 DirectX版本不匹配&#x…

JAVA:Spring Boot 3 实现 Gzip 压缩优化的技术指南

1、简述 随着 Web 应用的用户量和数据量增加&#xff0c;网络带宽和页面加载速度逐渐成为瓶颈。为了减少数据传输量&#xff0c;提高用户体验&#xff0c;我们可以使用 Gzip 压缩 HTTP 响应。本文将介绍如何在 Spring Boot 3 中实现 Gzip 压缩优化。 2、配置 Spring Boot 3 对…

哈希表,哈希桶的实现

哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素 时&#xff0c;必须要经过关键码的多次比较。顺序查找时间复杂度为O(N)&#xff0c;平衡树中为树的高度&#xff0c;即 O(logN)&#xff0c;搜索的效率取决…

从 EXCEL 小白到 EXCEL 高手的成长之路

在职场与日常生活中&#xff0c;Excel 作为一款强大的数据处理与分析工具&#xff0c;扮演着不可或缺的角色。无论是初学者还是资深职场人士&#xff0c;掌握 Excel 技能都能极大地提高工作效率。那么&#xff0c;从一个 Excel 小白蜕变成为 Excel 高手&#xff0c;究竟需要多久…

TiDB 无统计信息时执行计划如何生成

作者&#xff1a; weiyinghua 原文来源&#xff1a; https://tidb.net/blog/4c49ac0d 一、Pseudo 统计信息总体生成规则 TiDB 在表无统计信息时&#xff0c;不会进行动态采样&#xff0c;而是用静态的、预设规则以及经验假设来生成计划。用函数 PseudoTable 创建一个伪统…

org.apache.commons.lang3包下的StringUtils工具类的使用

前言 相信平时在写项目的时候&#xff0c;一定使用到StringUtils.isEmpty()&#xff1b;StringUtils.isBlank();但是你真的了解他们吗&#xff1f; 也许你两个都不知道&#xff0c;也许你除了isEmpty/isNotEmpty/isNotBlank/isBlank外&#xff0c;并不知道还有isAnyEmpty/isNon…

【工具推荐】dnsx——一个快速、多用途的 DNS 查询工具

basic/基本使用方式 echo baidu.com | dnsx -recon # 查询域名所有记录echo baidu.com | dnsx -a -resp # 查询域名的a记录echo baidu.com | dnsx -txt -resp # 查询域名的TXT记录echo ip | dnsx -ptr -resp # ip反查域名 A记录查询 TXT记录查询 ip反查域名 help/帮助信息 输…

Hive高可用配置

在hive的商用上没有集群一说&#xff0c;而且它本身也不是数据库&#xff0c;只是hadoop的数据sql化工具&#xff0c;但是hive可以配置高可用&#xff0c;通常业内对元数据服务会开5个&#xff0c;而HS2服务开3个&#xff0c;来保证hive服务的高可用 配置方式也很简单&#xf…

使用数学方法实现K-Nearest Neighbors(KNN)算法

目录 ​编辑 引言 KNN算法的数学基础 1. 距离度量 欧氏距离 曼哈顿距离 2. 寻找最近邻 3. 决策规则 分类 回归 4. 权重 KNN算法的实现步骤 1. 参数选择 2. 实现 导入必要的库 加载数据集 划分训练集和测试集 创建KNN模型 训练模型 预测测试集 计算准确率 …

提升用户体验、创新产品与高效运营,企业发展三驾马车

​在当今竞争激烈的市场环境中&#xff0c;企业要想脱颖而出并持续发展&#xff0c;需同时在提升用户体验、推动产品创新以及实现内部高效运营方面下功夫。 提升用户体验至关重要。它能提高用户满意度和忠诚度&#xff0c;增加用户口碑与推荐&#xff0c;提升企业品牌形象。可通…

在 Mac(ARM 架构)上安装 JDK 8 环境

文章目录 步骤 1&#xff1a;检查系统版本步骤 2&#xff1a;下载支持 ARM 的 JDK 8步骤 3&#xff1a;安装 JDK步骤 4&#xff1a;配置环境变量步骤 5&#xff1a;验证安装步骤 6&#xff1a;注意事项步骤7&#xff1a;查看Java的安装路径 在 Mac&#xff08;ARM 架构&#xf…

【Redis】—0.1、Ubuntu20.04源码编译部署redis6.2.7

1、Redis下载 创建redis的目录&#xff1a;mkdir -p /data/db/redis 下载redis&#xff1a;https://redis.io/download/ 2、上传文件到目录后解压 tar xvf redis-6.2.7.tar.gz 3、安装redis的依赖软件更新gcc&#xff0c;装一系列软件包&#xff0c;gcc&#xff0c;g和make。 s…

redis都有哪些用法

1. 缓存&#xff08;Caching&#xff09;&#xff1a; • Redis常被用作缓存层&#xff0c;存储那些频繁访问但更新不频繁的数据&#xff0c;以减少数据库的访问压力&#xff0c;提高数据读取速度。 • LRU&#xff08;Least Recently Used&#xff09;淘汰策略&#xff1a;Red…

npm install -g@vue/cli报错解决:npm error code ENOENT npm error syscall open

这里写目录标题 报错信息1解决方案 报错信息2解决方案 报错信息1 使用npm install -gvue/cli时&#xff0c;发生报错&#xff0c;报错图片如下&#xff1a; 根据报错信息可以知道&#xff0c;缺少package.json文件。 解决方案 缺什么补什么&#xff0c;这里我们使用命令npm…

爬取boss直聘上海市人工智能招聘信息+LDA主题建模

爬取boss直聘上海市人工智能招聘信息 import time import tqdm import random import requests import json import pandas as pd import os from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriv…

【STM32+HAL】FreeRTOS学习小札

一、RTOS程序任务结构 如上图所示&#xff0c;在实时操作系统中&#xff0c;开发人员可以把要实现的功能划分为多个任务&#xff0c;每个任务负责实现其中的一部分&#xff0c;每个任务都是一个很简单的程序&#xff0c;通常是一个死循环。 二、多任务系统基本概念 1、FreeRTO…

路径规划之启发式算法之二:遗传算法(Genetic Algorithm)

遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是一种基于自然选择和遗传学原理的优化搜索算法&#xff0c;它通过模拟自然界的进化过程来寻找最优解。 一、基本原理 遗传算法的基本原理是模拟自然选择、遗传和突变等生物进化过程。它通过将问题的求解过程转换成类似…

【ubuntu24.04】GTX4700 配置安装cuda

筛选显卡驱动显卡驱动 NVIDIA-Linux-x86_64-550.135.run 而后重启:最新的是12.6 用于ubuntu24.04 ,但是我的4700的显卡驱动要求12.4 cuda

Springboot的文件上传与下载

Springboot的文件上传与下载 文章说明配置路径映射实体类、服务与控制器前端页面前端服务器搭建 文章说明 文件上传实现了&#xff0c;文件下载是非常简单的&#xff0c;只需要通过浏览器即可下载成功&#xff1b;于是就没有实现专门的接口 配置路径映射 通过 public void addR…