【和春笋一起学C++】(十七)C++函数新特性——内联函数和引用变量

news2025/6/6 16:46:22

C++提供了新的函数特性,使之有别于C语言。主要包括:

  1. 内联函数;
  2. 按引用传递变量;
  3. 默认参数值;
  4. 函数重载(多态);
  5. 模版函数;

因篇幅限制,本文首先介绍内联函数和引用变量的定义。

目录

1. 内联函数

2. 引用变量

2.1 创建引用变量

2.2 引用和指针的区别

2.3 引用用作函数参数


1. 内联函数

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

编译的最终产品是可执行程序,可执行程序由一组机器语言指令组成。程序运行时,操作系统将这些指令载入到计算机的内存中,因此,每条指令都有特定的内存地址,计算机将逐步执行这些指令。

内联函数的运行速度比常规函数稍快,但代价是需要占用更多的内存。

那什么函数适合设置为内联函数?

一般来说,经常被调用且函数运行时间很短的函数适合设置为内联函数。

那怎么设置内联函数呢?首先在函数声明前加上关键字inline,然后在函数定义前也加上关键字inline,但通常的做法是省略函数原型,直接将整个定义放在本应提供原型的地方。

一个关于内联函数的简单实例:

#include <iostream>

using namespace std;
inline double square(double x) { return x * x; }
int main()
{
	double a = 5.0;
	double b = square(a);
	double c = square(a + 1);
	cout << "b= " << b << endl;
	cout << "c= " << c << endl;
	return 0;
}

输出值b=25,c=36,表明内联函数和常规函数一样,当参数为表达式,则函数将传递表达式的值,这使得内联函数的功能远远超过了C语言的宏定义。因此,在C++程序中如果使用了C语言的宏执行了类似函数的功能,应考虑将它们转换为C++内联函数(实际上,C语言使用预处理器语句#define来提供宏,是内联代码的原始实现)。


                                                原文为CSDN作者:三月微暖寻春笋 


2. 引用变量

引用变量是C++新增的复合类型,引用是已定义变量的别名。引用变量的主要用途是用作函数参数,通过将引用变量用作函数参数,函数将使用原始数据,而不是其拷贝。除指针外,引用也为函数处理大型结构提供了一种非常方便的用途。

2.1 创建引用变量

C和C++使用&符合来指示变量的地址。C++给&符合赋予了另一个含义,将其用来声明引用,有如下两条语句:

double a = 5.0;
double & b = a;

其中,&不是地址操作符,而是类型标识符的一部分,就像声明指针变量一样,char*指的是指向char的指针,int &指的是指向int的引用。将b声明为a的引用,代表a和b是一样的,在后面的代码中,a和b可以完全互换,a和b的值以及它们指向的内存地址都相同。为了验证这一点,请看下面的小程序:

#include <iostream>

using namespace std;
int main()
{

	double a = 5.0;
	double & b = a;
	cout << "a = " << a << ",  b = " << b << endl;
	cout << "&a = " << &a << ",  &b = " << &b << endl;

	a++;
	cout << "a = " << a << ",  b = " << b << endl;
	cout << "&a = " << &a << ",  &b = " << &b << endl;

	b++;
	cout << "a = " << a << ",  b = " << b << endl;
	cout << "&a = " << &a << ",  &b = " << &b << endl;

	return 0;
}

程序输出如下:

 程序说明:

上述程序表明,a和b是完全一样的,将a加1意味着将b也加1,将b加1意味着将a也加1,不仅它们的值相同,而且它们的内存地址也相同。

程序中需要注意的是&操作符,如果&操作符的前面有内置类型、结构或对象,则&代表将变量声明为引用,否则&操作符是一个取地址操作符。

对于指针来说,如果*操作符的前面有内置类型,结构或对象,则*代表将变量声明为指针变量,否则*操作符是一个解除引用操作符。

2.2 引用和指针的区别

有以下3条语句:

int a = 2;
int &b = a;
int *c = &a;

上述三条语句表示,b和*c都可以同a互换,&b和c又都可以同&a互换。

引用和指针的区别之一是,引用变量必须在声明时同时进行初始化,而指针可以先声明,再赋值。

引用更接近const指针,必须在创建时进行初始化,一旦与某个变量关联起来,就必须一直效忠于它。

int a = 2;
int &b = a;
int * const c = &a;

引用b所扮演的角色与*c相同。 

2.3 引用用作函数参数

将引用用作函数参数主要是指将结构的引用或对象的引用用作函数参数。

引用被用作函数参数,使函数中的变量名成为调用程序中的变量的别名,这种传递参数的方法称为按引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。C++新增的这项特性是对C语言的超越。


因篇幅限制,将引用用作函数参数的详细内容放在下篇博客中介绍。

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

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

相关文章

proteus新建工程

1 点击新建工程 2 输入项目名&#xff0c;选择工程文件夹 3 下一步 4 不创建pcb 5 直接下一步 6 点击完成 7 创建完毕

RTC实时时钟DS1338Z-33/PT7C433833WEX国产替代FRTC1338S

FRTC1338S是NYFEA徕飞公司推出的一种高性能的实时时钟芯片&#xff0c;它采用了SOP8封装技术&#xff0c;这种技术因其紧凑的尺寸和出色的性能而被广泛应用于各类电子设备中。 FRTC1338S串行实时时钟(RTC)是一种低功耗的全二进制编码十进制(BCD)时钟/日历外加56字节的非易失性…

Redis命令使用

Redis是以键值对进行数据存储的&#xff0c;添加数据和查找数据最常用的2个指令就是set和get。 set&#xff1a;set指令用来添加数据。把key和value存储进去。get&#xff1a;get指令用来查找相应的键所对应的值。根据key来取value。 首先&#xff0c;我们先进入到redis客户端…

【免费数据】1980-2022年中国2384个站点的水质数据

水&#xff0c;是生命之源&#xff0c;关乎着地球上每一个生物的生存与发展。健康的水生生态系统维持着整个水生态的平衡与活力&#xff1b;更是确保人类能持续获得清洁水源的重要保障。水质数据在水质研究、海洋生物量测算以及生物多样性评估等诸多关键领域都扮演着举足轻重的…

Git 极简使用指南

Git 是一个强大的分布式版本控制系统&#xff0c;但入门只需要掌握几个核心概念和命令。本指南旨在帮助你快速上手&#xff0c;处理日常开发中最常见的 80% 的场景。 核心概念 仓库 (Repository / Repo): 你的项目文件夹&#xff0c;包含了项目的所有文件和完整的历史记录。…

力扣刷题Day 69:搜索二维矩阵(74)

1.题目描述 2.思路 首先判断target是否有可能在矩阵的某一行里&#xff0c;没可能直接返回False&#xff0c;有可能就在这一行里二分查找。 3.代码&#xff08;Python3&#xff09; class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> boo…

MySQL指令个人笔记

MySQL学习&#xff0c;SQL语言笔记 一、MySQL 1.1 启动、停止 启动 net start mysql83停止 net stop mysql831.2 连接、断开 连接 mysql -h localhost -P 3306 -u root -p断开 exit或者ctrlc 二、DDL 2.1 库管理 2.1.1 直接创建库 使用默认字符集和排序方式&#xf…

2022年 国内税务年鉴PDF电子版Excel

2022年 国内税务年鉴PDF电子版Excelhttps://download.csdn.net/download/2401_84585615/89784658 https://download.csdn.net/download/2401_84585615/89784658 2022年国内税务年鉴是对中国税收政策、税制改革和税务管理实践的全面总结。这份年鉴详细记录了中国税收系统的整体状…

基于Java的OPCDA采集中间件

1.软件功能及技术特点简介&#xff1a; 软件功能及技术特点简介&#xff1a; OPCDA是基于Java语言开发的OPC client&#xff08;OPC客户端&#xff09;跨平台中间件软件&#xff0c;他支持OPC SERVER的OPC DA1.0/2.0/3.0。OPCDA实时采集数据&#xff08;包括实时数据、报警数…

vue2 项目中 npm run dev 运行98% after emitting CopyPlugin 卡死

今天在运行项目时&#xff0c;发现如下问题&#xff1a; 开始以为是node_modules依赖的问题&#xff0c;于是重新 npm install&#xff0c;重启项目后还是未解决。 在网上找了一圈发现有人说是 require引入图片地址没有写。在我的项目中排查没有这个问题&#xff0c;最后发现某…

JavaScript 性能优化实战:从原理到框架的全栈优化指南

在 Web 应用复杂度指数级增长的今天&#xff0c;JavaScript 性能优化已成为衡量前端工程质量的核心指标。本文将结合现代浏览器引擎特性与一线大厂实践经验&#xff0c;构建从基础原理到框架定制的完整优化体系&#xff0c;助你打造高性能 Web 应用。 一、性能优化基础&#x…

2025年- H61-Lc169--74.搜索二维矩阵(二分查找)--Java版

1.题目描述 2.思路 方法一&#xff1a; 定义其实坐标&#xff0c;右上角的元素&#xff08;0&#xff0c;n-1&#xff09;。进入while循环&#xff08;注意边界条件&#xff0c;行数小于m&#xff0c;列数要&#xff1e;0&#xff09;从右上角开始开始向左遍历&#xff08;比当…

【黄金评论】美元走强压制金价:基于NLP政策因子与ARIMA-GARCH的联动效应解析

一、基本面&#xff1a;多因子模型解析黄金承压逻辑 1. 政策冲击因子驱动美元强势 通过NLP模型对关税政策文本进行情感分析&#xff0c;构建政策不确定性指数&#xff08;PUI&#xff09;达89.3&#xff0c;触发美元避险需求溢价。DSGE模型模拟显示&#xff0c;钢铁关税上调至…

Flink进阶之路:解锁大数据处理新境界

目录 一、Flink 基础回顾 二、Flink 进阶知识深入 2.1 数据类型与序列化 2.2 双流 Join 操作 2.3 复杂事件处理&#xff08;CEP&#xff09; 2.4 状态管理与优化 三、Flink 在实际场景中的应用 3.1 实时智能推荐 3.2 实时欺诈检测 3.3 实时数仓与 ETL 四、Flink 性能…

【论文阅读】Dolphin: Document Image Parsing via Heterogeneous Anchor Prompting

Paper&#xff1a;https://arxiv.org/abs/2505.14059 Source code: https://github.com/bytedance/Dolphin 作者机构&#xff1a;字节跳动 背景 业务场景 企业数据大多数都以文本、图片、扫描件、电子表格、在线文档、邮件等文档的形式存在&#xff0c;例如&#xff1a;PDF文…

谷歌地图免费下载手机版

软件标签: 谷歌地图 谷歌卫星高清地图 下载链接&#xff1a;夸克网盘分享 手机地图 谷歌地图免费下载(google maps)是谷歌公司打造的手机高清电子地图。2024谷歌地图官方中文版能够直观的表达出世界各地的地点&#xff0c;在地图中能够清晰的了解到自身的定位&#xff0c;让…

DeepSeek 赋能金融衍生品:定价与风险管理的智能革命

目录 一、引言1.1 金融衍生品市场发展现状1.2 DeepSeek 的技术特点和优势1.3 研究目的和意义 二、金融衍生品定价与风险管理基础2.1 金融衍生品定价常用方法2.2 金融风险管理主要策略 三、DeepSeek 在金融衍生品定价中的应用3.1 DeepSeek 助力定价模型构建3.2 案例分析&#xf…

论文中pdf图片文件太大怎么办

文章目录 1.使用pdf文件的打印功能将文件导出2.操作3.前后文件大小对比 1.使用pdf文件的打印功能将文件导出 该方法在保证清晰度的同时&#xff0c;内存空间也能实现减少&#xff08;如果使用线上的压缩pdf工具&#xff0c;清晰度会直线下降&#xff09; 2.操作 点击文件—&…

简单爬虫框架实现

1. 框架功能概述 (1) HttpSession 类&#xff1a;请求管理 功能&#xff1a;封装 requests 库&#xff0c;实现带重试机制的 HTTP 请求&#xff08;GET/POST&#xff09;。关键特性&#xff1a; 自动处理 429&#xff08;请求过多&#xff09;、5xx&#xff08;服务器错误&am…

MVCC理解

MySQL的MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09;是一种高效的并发控制机制&#xff0c;通过维护数据的多个版本实现读写操作的并行执行&#xff0c;显著提升数据库的并发性能和数据一致性。 MVCC 的实现依赖于&#xff1a;隐…