引用(C++)和内联函数

前言:本文主要讲解C++语法中引用如何使用和使用时的一些技巧

基本语法

引用就是取别名

#include <iostream>
using namespace std;
int main()
{
	int a = 10;
	int& b = a;//给a取别名为b
	cout << a << endl;
	cout << b << endl;
	return 0;
}

b的数据类型是:int& 

 在内存中,引用与原变量是同一块空间

引用的特性

1.引用必须初始化
 

int& b;

2.一个变量可以有多个引用 

	int a = 10;
	int& b = a;
	int& c = a;
	int& d = a;

3.引用一旦初始化后,就不能在引用其他实体。

	int a = 10;
	int c = 12;
	int& b = a;
	//这是赋值?还是引用?
	b = c;
	//上面是赋值

引用和指针的权限问题 

权限放大

	const int a = 10;//用const修饰a后,a的权限为只读,不能修改a的值
	int& b = a;//如果用b引用a后b的权限可以读和写

b引用a后权限放大,会报错 

	double a = 1.2;
	int& b = a;


这种情况也权限放大

	int x = 0, y = 1;
	int& a = x + y;
    //const int& a = x + y;如果这样写不会有权限放大的问题

将x+y的结果需要有临时变量来存储,再赋值给a,所以出现了 权限的放大

权限缩小

	int a = 10;
	const int& b = a;

a的权限:可读可写

b的权限:只读

权限缩小,不会报错

权限平移

	const int a = 10;
	const int& b = a;

a的权限:只读

b的权限:只读

权限平移,不会报错

总结,权限放大会有语法错误,权限的缩小和平移没有语法错误。

指针中的权限问题

权限放大

	int a = 10;
	const int* p1 = &a;
	int* p2 = p1;

const修饰p1指向的空间为只读,p2的权限为可读可写,权限出现了放大,会有语法错误。

权限缩小

	int a = 10;
	int* p1 = &a;
	const int* p2 = p1;

权限平移

	int a = 10;
	const int* p1 = &a;
	const int* p2 = p1;

引用作函数参数

C语言下实现两个值的交换的函数

void Swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int main()
{
	int a = 10;
	int b = 11;
	Swap(&a, &b);
	return 0;
}

这里需要传指针,才能交换,否则就交换不了

C++环境下直接将引用作为函数参数也可以实现这个效果

void Swap(int& a, int& b)
{
	int tmp = a;
	a = b;
	b = tmp;
}

int main()
{
	int a = 10;
	int b = 11;
	Swap(a, b);
    return 0;
}

引用与指针的不同点

C++中的引用不能完全代替指针,比如链表的实现,指针一旦初始化后就不能在引用其他实体,而链表的插入和删除都需要改变链表的指向。

程序为指针变量分配内存区域,而不为引用分配内存区域。

指针使用时要在前加 * ,引用可以直接使用。

引用在定义时就被初始化,之后无法改变;指针可以发生改变。 即引用的对象不能改变,指针的对象可以改变。

没有空引用,但有空指针。这使得使用引用的代码效率比使用指针的更高。因为在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。

对引用使用“sizeof”得到的是变量的大小,对指针使用“sizeof”得到的是变量的地址的大小

理论上指针的级数没有限制,但引用只有一级。即不存在引用的引用,但可以有指针的指针。
int **p //合法
int &&p //非法

++引用与++指针的效果不一样。
例如就++操作而言,对引用的操作直接反应到所指向的对象,而不是改变指向;而对指针的操作,会使指针指向下一个对象,而不是改变所指对象的内容。
 

 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/xsydalao/article/details/93623647

内联函数

频繁调用小函数会开辟栈帧,有性能的消耗,那么如何解决这个问题呢?

在C语言中,有宏函数,预处理是会将调用该函数的地方将函数展开,不会开辟栈帧。

在C++中有内联函数

关键字 inline

inline int Add(int x, int y)
{
	int z = x + y;
	return z;
}

建议编译器在程序中调用该函数时将函数直接展开,就不需要创建函数栈帧,减少了性能的消耗,

这仅仅是一个建议,编译器可能不采用。

内联函数的缺点

如果函数的实现复杂,且在被频繁调用在代码中被展开,就会是代码行数增多很多,也会导致最后生成的可执行文件大。

内联函数的定义与声明

文献来源于:inline内联函数(声明前加inline还是定义前加inline)_inline void-CSDN博客

关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用

如下风格的函数Foo 不能成为内联函数:

inline void Foo(int x, int y); // inline 仅与函数声明放在一起

void Foo(int x, int y){}

而如下风格的函数Foo 则成为内联函数:

void Foo(int x, int y);

inline void Foo(int x, int y) // inline 与函数定义体放在一起{}

所以说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内联函数的声明、定义体前面都加了inline 关键字,但我认为inline 不应该出现在函数的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C 程序设计风格的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。

结语:希望本文能够让各位看官有所收获。

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

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

相关文章

Apple开发者macOS描述文件创建

1.选择Profiles然后点击加号创建 2.选择类型为macOS App Development然后点击继续 3.选择描述类型与App ID 然后点击继续 4.选择证书然后点击继续 5.选择设备,然后点击继续 6.输入描述文件后,点击生成 生成成功,点击下载描述文件 下载完成会自动打开描述文件

1.Rust安装

目录 一、安装1.1 在Windows上安装1.2 在Linux下安装 二、包管理工具三、Hello World3.1 安装IDE3.2 输出Hello World 一、安装 1.1 在Windows上安装 点击页面 安装 Rust - Rust 程序设计语言 (rust-lang.org)&#xff0c;选择"下载RUSTUP-INIT.EXE(64位&#xff09;&qu…

一.网络基础——OSI七层模型

一.OSI七层模型 OSI&#xff08;Open System Interconnection&#xff0c;开放系统互连&#xff09;七层网络模型被称为开放式系统互联参考模型&#xff0c;它是一个逻辑上的定义和规范; 它把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备&#xff0c;比如路由器&…

SpringBoot高手之路04-Aop

文章目录 AOP 基础AOP概述start依赖,开发某一个功能,只需要下载这一个依赖,关于他的依赖都会下载下来 AOP快速入门AOP核心概念 切入点表达式-execution AOP 基础 AOP概述 AOP 对特定的方法做增强 AOP 快速入门 start依赖,开发某一个功能,只需要下载这一个依赖,关于他的依赖…

python数据文件处理库-pandas

内容目录 一、pandas介绍二、数据加载和写出三、数据清洗四、数据转换五、数据查询和筛选六、数据统计七、数据可视化 pandas 是一个 Python提供的快速、灵活的数据结构处理包&#xff0c;让“关系型”或“标记型”数据的交互既简单又直观。 官网地址: https://pandas.pydata.o…

Polar Web 【简单】- 被黑掉的站

Polar Web 【简单】- 被黑掉的站 Contents Polar Web 【简单】- 被黑掉的站思路EXP运行&总结 思路 如题目所述&#xff0c;这是一个被黑掉的站点&#xff0c;由此不禁要了解该黑客发现了哪些可以入手的路径&#xff0c;或是留下了什么样的文件供持续访问。 目录扫描该站点发…

AI和机器人引领新一轮农业革命

AI和机器人技术在农业领域的应用正在迅速发展&#xff0c;未来它们可能会实现厘米级精度的自主耕作。 精确种植&#xff1a;AI算法可以分析土壤条件、气候数据和作物生长周期&#xff0c;以决定最佳种植地点和时间。 土壤管理&#xff1a;利用传感器和机器学习&#xff0c;机器…

Windows安装运行elasticsearch服务

官方下载地址&#xff1a;Download Elasticsearch | Elastic 我在linux上执行的下载命令&#xff1a;wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.5.3-linux-x86_64.tar.gz Elasticsearch&#xff08;简称ES&#xff09;是一款基于Apache Lu…

JVM学习-Arthas

Arthas Alibaba开源的Java诊断工具&#xff0c;在线排查问题&#xff0c;无需重启&#xff0c;动态跟踪Java代码&#xff0c;实时监控JVM状态Arthas支持JDK6&#xff0c;支持Linux/Mac/Windows&#xff0c;采用命令行交互模式&#xff0c;同时提供丰富的Tab自动补全功能&#…

前端传参数后端变量类型能够接受到List却无法接收到值

问题描述 今天写了个接口&#xff0c;下图所示 ReqVO里是这样的&#xff1a; 然后前端去请求&#xff0c;从请求结果中看发现这里值是在的&#xff08;有经验的可能就看出来了otherInfo.id: 这样以参数后端是接收不到的&#xff0c;但是当时没发现&#xff09; 传进来后端…

【cmake】cmake cache

cmake cache是什么 cmake cache是cmake在配置好后生成的一个CMakeCache.txt的文件&#xff0c;里面存储了一堆变量&#xff0c;这些变量一般都是关于项目的配置和环境的。 比如你用的什么编译器&#xff0c;编译器选项&#xff0c;还有项目目录。 例如&#xff08;在cmakelist…

uniAPP @input时报错

<input :maxlength"8" v-model"item.value" placeholder"请输入金额" input"inputFn" /> 这些些时会报以下错误 定位了好久之后发现input不支持 v-model和input一起使用 改成以下这般就正常啦 <input :maxlength"8&q…

【Cityengine】Cityengine生产带纹理的建筑模型导入UE4/UE5(下)

【Cityengine】Cityengine生产带纹理的建筑模型导入UE4/UE5&#xff08;下&#xff09; 一、导出数据&#xff08;2022中文版案例&#xff09;二、安装datasmith插件三、导入数据四、检查导入材质是否正常五、编辑替换材质六、安装模型编辑插件七、编辑替换建筑规则 一、导出数…

⌈ 传知代码 ⌋ 辅助任务改进社交帖子多模态分类

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

WPS表格插件方方格子【凑数】功能:选出和等于固定数字的数

文章目录 后来发现可以下载方方格子插件&#xff0c;使用【凑数】功能https://ffcell.lanzouj.com/iwhfc1kjhayh【凑数】快速【凑数】 导师让沾发票&#xff0c;需要选出若干个数额的发票&#xff0c;使它们的和等于一个指定数。不知道怎么办了&#xff0c;查了一下&#xff0c…

实验9 浮动静态路由配置

--名称-- 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤 一、 原理描述 浮动静态路由也是一种特殊的静态路由&#xff0c;主要考虑链路冗余。浮动静态路由通过配置一条比主路由优先级低的静态路由&#xff0c;用于保证在主路由失效的情况下&#xff0c;…

为什么我们需要在软件本地化过程中使用术语服务?

你知道软件翻译和本地化的术语服务吗&#xff1f;此解决方案涵盖源术语和目标术语的创建、开发和维护。所有术语都存储在具有多个字段的数据库中&#xff0c;包括术语定义、用法示例、上下文和历史记录。这使我们能够正确处理每个术语的创建或更改请求&#xff0c;避免创建重复…

orbslam2代码解读(1):数据预处理过程

写orbslam2代码解读文章的初衷 首先最近陆陆续续花了一两周时间学习视觉slam&#xff0c;因为之前主要是做激光slam&#xff0c;有一定基础所以学的也比较快&#xff0c;也是看完了视觉14讲的后端后直接看orbslam2的课&#xff0c;看的cvlife的课&#xff08;课里大部分是代码…

SpringBoot+Vue校园管理系统(前后端分离)

技术栈 JavaSpringBootMavenMyBatisMySQLVueElement-UIShiro 系统角色 管理员用户院系管理员 系统功能截图

OrangePi KunPengPro | linux系统下挂载U盘

OrangePi KunPengPro | linux系统下挂载U盘 时间&#xff1a;2024年6月6日21:32:53 文章目录 OrangePi KunPengPro | linux系统下挂载U盘1.参考2.操作fdisk -l 列出系统上所有磁盘的分区表信息将 /dev/sda1 分区挂载到 /mnt/udisk/ 目录显示文件系统的磁盘空间使用情况卸载文件…