C++学习笔记1——引用

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

引用是已定义的变量的别名。如变量a为变量b的应用,则可以交替使用a或者b来表示该变量。引用变量主要用于函数的形参,此时函数使用的是该变量的原始数据而不是变量的副本。其作用有些类似于指针,但在类设计中有更广泛的应用。

1. 创建引用变量

C++使用&符号来标记引用,如下:

int rats;
int & rodents = rats; // rodents称为rats的别名

int &表示指向int的引用。使用rats和rodents指向相同的值和内存单元。
这一点上与指针很类似,但与指针的区别在于引用必须在声明时进行初始化,而不能像指针一样先声明,再赋值。 如以下代码是不正确的:

int rat;
int & rodent;
rodent = rat; // 无法执行此语句

这种意义上来说***引用更接近于const指针,一旦与某个变量关联起来就始终无法改变。***语句int & rodents = rats;实际上等效于int *const ptr = &rats;

2. 将引用用作函数参数

按引用传递允许被调用函数访问调用函数中的变量。如下程序展示了引用与指针传递的方法:

#include <iostream>
void swapr(int & a, int & b);// a, b为int的引用
void swapp(int * p, int * q);// p, q为int类型的地址

int main()
{
	using namespace std;
	int wallet1 = 300;
	int wallet2 = 350;
	cout <<"wallet1 = $" << wallet1;
	cout <<" wallet2 = $" << wallet2 <<endl;

	cout << "Using references to swap contents:\n";
	swapr(wallet1, wallet2);
	cout <<"wallet1 = $" << wallet1;
	cout <<" wallet2 = $" << wallet2 <<endl;

	cout << "Using pointers to swap contents:\n";
	swapp(&wallet1, &wallet2);
	cout <<"wallet1 = $" << wallet1;
	cout <<" wallet2 = $" << wallet2 <<endl;
}

void swapr(int & a, int & b)
{
	int temp;

	temp = a;
	a = b;
	b = temp;
}

void swapp(int * p, int * q)
{
	int temp;

	temp = *p;
	*p = *q;
	*q = temp;
}

运行结果:
在这里插入图片描述从函数调用来看,无法分辨按引用传递于按值传递,从函数定义中才能分辨:

void swapr(int & a, int & b);

引用必须在定义时进行初始化。而函数调用时使用实参初始化形参,因此函数的引用参数被初始化为函数调用传递的实参。因此swapr(wallet1, wallet2)将形参a和b分别初始化为wallet1和wallet2。

如想使用传递给函数的信息而不修改它,同时还想使用引用,应使用const引用。

  • 使用const可以避免无意中修改数据的编程错误
  • 使用const使函数能够处理const与非const实参,否则只能接受非const数据
  • 使用const引用使函数能够正确生成并使用临时变量

3. 将引用用于结构

如果函数按值返回一个结构,而不是结构的引用,则会将整个结构复制到一个临时位置,再复制到需要的变量;如果返回一个结构的引用,则直接将结构复制到需要的变量,效率更高。

**返回引用时,要避免返回函数终止时不再存在的内存单元引用。**如下代码:

const free_throws & clone2(free_throw & fit)
{
	free_throws newguy;
	newguy = ft;
	return newguy;
}

newguy为函数中的临时变量,函数返回时已经不存在。同理,也应该避免返回指向临时变量的指针。

避免此类问题最简单的方法是返回一个作为参数传递给函数的引用。

4. 何时使用引用参数

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

  • 程序员能够修改调用函数中的数据对象
  • 通过传递引用而不是整个数据对象,可以提高程序的运行速度

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

  • 如果数据对象很小,则按值传递;
  • 如果数据对象是数组,则使用指针,这是唯一的选择,并将指针声明为指向const的指针
  • 如果数据对象是较大的结构,则使用const指针或const引用
  • 如果数据对象是类对象,则使用const引用。传递类对象参数的标准方式是按引用传递

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

  • 如果数据对象是内置数据类型,则使用指针
  • 如果数据对象是数组,只能使用指针
  • 如果数据对象是结构,使用引用或指针
  • 如果数据对象是类对象,则使用引用

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

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

相关文章

pychar社区版下载

文章目录 第⼀步&#xff1a;下载社区版第二步&#xff1a;安装pycharm社区版第三步&#xff1a;创建项目 第⼀步&#xff1a;下载社区版 下载网址&#xff1a;https://www.jetbrains.com/pycharm/download/other.html 第二步&#xff1a;安装pycharm社区版 第三步&#xff1a…

从选题到致谢!50条经典ChatGPT学术指令1天完成1篇论文

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 还在为毕业论文头疼&#xff1f;今天给你分享50条神仙提示词&#xff0c;直接1天搞定整篇论文&#xff01;从选题到致谢&#xff0c;全流程全覆盖。你可能不信&#xff0c;论文还能这么快写完&#xff1f;真…

云渲染与3D视觉效果如何影响珠宝行业!

3D渲染技术在珠宝行业的应用正迅速增长&#xff0c;2023年已带来数亿元收益&#xff0c;预计2024年将继续保持增长态势。珠宝品牌正越来越多地采用3D可视化技术来提升产品展示&#xff0c;以在激烈的市场竞争中占据优势。 云渲染技术不仅提升了渲染效率&#xff0c;还降低了成…

记一次有趣的发现-绕过堡垒机访问限制

前言 在某一次对设备运维管理的时候&#xff0c;发现的某安全大厂堡垒机设备存在绕过访问限制的问题&#xff0c;可以直接以低权限用户访问多个受控系统&#xff0c;此次发现是纯粹好奇心驱使下做的一个小测试压根没用任何工具。因为涉及到了很多设备和个人信息&#xff0c;所以…

项目实战:构建 effet.js 人脸识别交互系统的实战之路

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀构建 effet.js &#x1f4d2;1. 什么是effet.js&#x1f4dc;2. 为什么需要使用effet.js&#x1f4dd;3. effet.js的功能&#x1f4da;4. 使用…

【国产操作系统】揭秘deepin 23自定义、全盘、高级安装的奥秘,携手探索无限可能,尝鲜之旅,等你来驾驭!

简述 deepin 作为国内最好的个人桌面Linux社区发行版之一&#xff0c;其实受到很多人的关系&#xff0c;对于很多普通用户来说&#xff0c;其很易用&#xff0c;不需要怎么折腾&#xff0c;界面也非常友好。 针对技术型的 Linux 用户&#xff0c;可能对 deepin 的态度就是仁者…

文献分享: 高维ANN算法的综述

文章目录 0. \textbf{0. } 0. 写在前面 0.1. \textbf{0.1. } 0.1. 一些预备知识 0.2. \textbf{0.2. } 0.2. 本文的主要研究 0.3. \textbf{0.3. } 0.3. 本文一些研究限制 1. \textbf{1. } 1. 三大类 ANN \textbf{ANN} ANN算法回顾以及 DPG \textbf{DPG} DPG 1.1. \textbf{1.1. …

基于递推式最小二乘法的PMSM参数辨识MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 最小二乘法是一种回归估计法&#xff0c;适用于被辨识的参数与系统输出为线性关 系的情况。它是在一定数据量下&#xff0c;基于系统输出误差的平方和最小的准则对参 数进行辨识的方法。此模型通过…

案例分享-优秀蓝色系UI界面赏析

蓝色UI设计界面要提升舒适度&#xff0c;关键在于色彩搭配与对比度。选择柔和的蓝色调作为主色&#xff0c;搭配浅灰或白色作为辅助色&#xff0c;能营造清新、宁静的氛围。同时&#xff0c;确保文字与背景之间有足够的对比度&#xff0c;避免视觉疲劳&#xff0c;提升阅读体验…

CatVTON:AI 虚拟换装的卓越之选

在时尚与科技融合的时代&#xff0c;CatVTON 作为一款创新的 AI 虚拟换装工具&#xff0c;正引领着时尚界的变革。它由中山大学、美图、Pixocial 和鹏城实验室等机构联合开发&#xff0c;以其独特的优势和卓越的性能&#xff0c;为时尚爱好者、电商从业者以及设计师们带来了前所…

URL路径以及Tomcat本身引入的jar包会导致的 SpringMVC项目 404问题、Tomcat调试日志的开启及总结

一、URL路径导致的 SpringMVC项目 404问题 SpringMVC项目的各项代码都没有问题&#xff0c;但是在页面请求时仍然显示404&#xff0c;编译的时候报了下面的问题&#xff1a; org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录…

Windows下搭建VUE开发环境

Windows下搭建VUE开发环境 文章目录 Windows下搭建VUE开发环境第一步 安装nodejs下载nodejs安装nodejs配置环境变量安装测试配置npm的路径配置npm的国内代理安装必要工具测试工具安装的使用 第二步 安装vscode下载vscode安装插件Chinese (Simplified) (简体中文) Language Pack…

从0到1构建Next.Js项目SSG和SSR应用

最近在探索学习前端工程化相关内容&#xff0c;在如今前后端分离的架构下&#xff0c;为了提升首屏渲染速度和 SEO 效果&#xff0c;兜兜转转&#xff0c;又回到了服务端渲染。 本文主要是讲讲如何使用 Next.js 框架实现服务端渲染&#xff0c;重构或优化现有前端应用的 SEO 和…

光伏工程造价单自动生成

光伏工程造价单依据光伏设计图自动生成。 一、组件 类型&#xff1a;光伏组件是光伏电站的核心设备&#xff0c;负责将太阳能转化为电能。常见的类型包括单晶硅组件、多晶硅组件、薄膜组件等。 规格型号&#xff1a;具体规格型号取决于电站的设计需求&#xff0c;例如功率、…

企业博客SEO优化:8个必备工具与资源指南

在当今数字化时代&#xff0c;企业博客已远远超越了传统意义上的信息展示平台。它不仅是企业展示品牌形象、传递品牌价值的重要窗口&#xff0c;更是吸引潜在客户、增强用户粘性、提升网站流量和搜索引擎排名的关键。通过精心策划和高质量的内容创作&#xff0c;企业博客能够建…

【OpenGL】创建窗口/绘制图形

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、创建窗口 1、代码流程图 2、运行结果 3、代码 二、三角形 1、顶点缓冲对象&#xff1a;Vertex Buffer Object…

【Qt】控件——Qt控件的介绍、QWidget的介绍、QWidget的属性、QWidget的函数

文章目录 Qt1. 控件的概念2. QWidgetenabledgeometrywindowTitlewindowIconwindowOpacitycursorfonttoolTiptoolTipDuringstyleSheet Qt 1. 控件的概念 Widget 是 Qt 中的核心概念。英文原义是 “小部件”&#xff0c;我们此处也把它翻译为 “控件”。控件是构成一个图形化界面…

吴恩达深度学习笔记(7)

误差分析&#xff1a; 你运行一个算法代替人类计算&#xff0c;但是没有达到人类的效果&#xff0c;需要手动检查算法中的错误&#xff0c;对模型的一些部分做相应调整&#xff0c;才能更好地提升分类的精度。如果不加分析去做&#xff0c;可能几个月的努力对于提升精度并没有…

Linux文件你不知道的那些事,搞清楚磁盘空间占用的问题

在进行采集日志时&#xff0c;日志文件明明被滚动压缩并转移走了&#xff0c;但是发现磁盘空间还是在不断增长&#xff0c;统一目录下的总文件大小&#xff0c;发现与实际占用也不符&#xff0c;于是想到可能是文件句柄未释放导致的&#xff0c;本文就来记录一下文件及文件句柄…

git clone 国内镜像

比如 git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM.git 改成 git clone https://gitclone.com/github.com/HKUST-Aerial-Robotics/A-LOAM.git