C++核心编程02——引用

news2024/9/24 13:23:55

摘录于B站黑马程序员提供的笔记。 

1. 引用的基本使用

作用: 给变量起别名

语法: 数据类型 &别名 = 原名

实例:

#include <iostream>
using namespace std;

int main() {
	// 引用基本语法
	// 数据类型 &别名 = 原名
	int a = 10;
	int& b = a;

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	b = 100;

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	system("pause");

	return 0;
}

 

2. 引用注意事项

  • 引用必须初始化

  • 引用在初始化后,不可以改变

 

实例:

#include <iostream>
using namespace std;

int main() {

	int a = 10;
	int b = 20;
	//int &c; //错误,引用必须初始化,这里没有对&c进行初始化
	int &c = a; //一旦初始化后,就不可以更改
	c = b; //这是赋值操作,不是更改引用

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;

	system("pause");

	return 0;
}

 

3. 引用做函数参数

作用:函数传参时,可以利用引用的技术让形参修饰实参

形参是否可修饰实参,其实就是问在main或者其他函数A中调用带形参的函数B,调用后是否会改变实参在函数A中的值。

优点:可以简化指针修改实参

示例:

#include <iostream>
using namespace std;

// 实现交换函数

//1. 值传递
void mySwap01(int a, int b) {
	int temp = a;
	a = b;
	b = temp;
	cout << "值传递代码中:" << "a = " << a << " b = " << b << endl;
}

//2. 地址传递
void mySwap02(int* a, int* b) {
	int temp = *a;
	*a = *b;
	*b = temp;
	cout << "地址传递代码中:" << "a = " << *a << " b = " << *b << endl;
}

//3. 引用传递
void mySwap03(int& b, int& a) {
	int temp = a;
	a = b;
	b = temp;
	cout << "引用传递代码中:" << "a = " << a << " b = " << b << endl;
}

int main() {

	int a = 10;
	int b = 20;
	cout << "main中的初始化:" << "a:" << a << " b:" << b << endl;

	mySwap01(a, b);
	// 值传递,main函数中a,b的值不会改变,还是和如上初始化的一样。即a =10,b=20 (形参不会修饰实参)
	cout <<"值传递main:"<< "a:" << a << " b:" << b << endl;  

	mySwap02(&a, &b);
	// 地址传递,main函数中a,b的值会改变(形参会修饰实参)
	cout << "地址传递main:" << "a:" << a << " b:" << b << endl;

	mySwap03(a, b);
	// 
	cout << "引用传递main:" << "a:" << a << " b:" << b << endl;

	system("pause");

	return 0;
}

总结:通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单  

 

4 引用做函数返回值

作用:引用是可以作为函数的返回值存在的

注意:不要返回局部变量引用

用法:函数调用作为左值

实例:

//返回局部变量引用
int& test01() {
	int a = 10; //局部变量
	return a;
}

//返回静态变量引用
int& test02() {
	static int a = 20;
	return a;
}

int main() {

	//不能返回局部变量的引用
	int& ref = test01();
	cout << "ref = " << ref << endl; 
	cout << "ref = " << ref << endl;

	//如果函数做左值,那么必须返回引用
	int& ref2 = test02();
	cout << "ref2 = " << ref2 << endl;
	cout << "ref2 = " << ref2 << endl;

	test02() = 1000;

	cout << "ref2 = " << ref2 << endl;
	cout << "ref2 = " << ref2 << endl;

	system("pause");

	return 0;
}

5. 引用的本质

本质:引用的本质在c++内部实现是一个指针常量.

讲解示例:

//发现是引用,转换为 int* const ref = &a;
void func(int& ref){
	ref = 100; // ref是引用,转换为*ref = 100
}
int main(){
	int a = 10;
    
    //自动转换为 int* const ref = &a; 指针常量是指针指向不可改,也说明为什么引用不可更改
	int& ref = a; 
	ref = 20; //内部发现ref是引用,自动帮我们转换为: *ref = 20;
    
	cout << "a:" << a << endl;
	cout << "ref:" << ref << endl;
    
	func(a);
	return 0;
}

结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了 。

6 常量引用

作用:常量引用主要用来修饰形参,防止误操作

在函数形参列表中,可以加==const修饰形参==,防止形参改变实参

示例: 

//引用使用的场景,通常用来修饰形参
void showValue(const int& v) {
	//v += 10;
	cout << v << endl;
}

int main() {

	//int& ref = 10;  引用本身需要一个合法的内存空间,因此这行错误
	//加入const就可以了,编译器优化代码,int temp = 10; const int &ref = temp;
    // int &ref = 10; // 这样写是非法的,因为引用必须引一块合法的内存空间;
	const int& ref = 10;

	//ref = 100;  //加入const后不可以修改变量,此时只是只读状态
	cout << ref << endl;

	//函数中利用常量引用防止误操作修改实参
	int a = 10;
	showValue(a); // 调用的函数void showValue(const int& v),const int& v表示用引用接收参数

	system("pause");

	return 0;
}

 

 

 

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

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

相关文章

开放式耳机怎么戴?五大市场热卖爆款推荐!

开放式耳机的佩戴方法通常比较直观&#xff0c;但具体步骤可能因不同品牌和型号的设计而异。以下是一般的佩戴步骤&#xff1a; 1. 调整耳机&#xff1a;大多数开放式耳机都有可调节的耳挂&#xff0c;首先调整耳挂&#xff0c;确保它能够舒适地适应你的耳朵形状。 2. 定位耳…

FGF20:多些研究关注

成纤维细胞生长因子20&#xff08;FGF20&#xff09;是FGF9亚家族成员&#xff0c;作为调节中枢神经发育和功能的神经营养因子。 &#xff08;数据来源AlphaFold&#xff09; FGF20由208个氨基酸组成&#xff0c;属于分泌型胞外蛋白&#xff0c;无信号肽区段&#xff0c;功能域…

独辟蹊径:找工作时的创新思维——之找到一份工作

一、背景 在日常生活中我们会遇到一些开发者抱怨“资深开发者牢牢占据着岗位&#xff0c;让年轻开发者鲜有工作机会”。与此同时&#xff0c;也有一些开发者抱怨说&#xff1a;没有人愿意招聘上了点年纪的开发者&#xff0c;每个人都在歧视大龄开发者。还有一些人抱怨他们的技…

【网络安全】服务基础阶段——第一节:Windows系统管理基础----进制转换与IP地址

一、进制转换与IP地址 进制与计算&#xff1a; 进制转换是指将一个数字从一个数制&#xff08;基数&#xff09;转换为另一个数制的过程 二进制&#xff08;Binary&#xff09;&#xff1a;基于0和1的数制&#xff0c;例如1011&#xff08;十进制11&#xff09;。八进制&…

网站分类目录提交技巧有哪些

在提交网站到分类目录时&#xff0c;掌握一定的技巧可以显著提升通过率和效果。以下是一些关键的提交技巧&#xff1a; 选择高质量的分类目录&#xff1a; 确保选择的分类目录有足够的流量和权重&#xff0c;这样提交的内容才能得到有效的展示。 考察分类目录的正规性和可信度&…

纷享AI | AI PaaS平台,企业智能转型的加速器

随着人工智能技术的飞速发展&#xff0c;企业对于智能化转型的需求愈发迫切。那么&#xff0c;企业如何把握先机&#xff0c;在激烈的市场竞争中保持领先&#xff1f;答案可能就藏在AI PaaS平台的无限潜力中。纷享销客AI PaaS平台通过Agent Builder和Model Builder为上层的场景…

山体滑坡预警摄像机

山体滑坡是一种常见的地质灾害&#xff0c;给人们的生命和财产安全带来了巨大威胁。为了及时监测山体滑坡的情况并提前预警&#xff0c;可以使用山体滑坡预警摄像机 。山体滑坡预警摄像机是一种结合了摄像技术和智能算法的设备&#xff0c;能够实时监测山体滑坡的变化情况&…

昂科烧录器支持Melexis迈来芯的位置传感器MLX90365KDC

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中Melexis迈来芯的位置传感器MLX90365KDC已经被昂科的通用烧录平台AP8000所支持。 MLX90365KDC是第II代Triaxis位置传感器IC。 这款单片器件可凭借其表面的集磁点(IMC)&#xf…

民大校园学习资料转让网站设计与实现---附源码97053

摘要 在当今数字化时代&#xff0c;学习资料转让网站作为在线学习和教育资源的重要平台&#xff0c;发挥着越来越重要的作用。为了满足用户对学习资料的需求&#xff0c;本论文旨在构建一个可靠高效的学习资料转让网站系统。 NodeJS是一个基于JavaScript的服务器端运行环境&…

【R语言实战】——多模型预测及评价

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

langchain入门系列之六 使用langchain构建PDF解析助手

本文将介绍如何使用langchain构建一个pdf解析助手&#xff0c;在此文中你将学习到langchain如何与web应用(fastapi)相结合&#xff0c;向量持久化等知识&#xff0c;话不多说&#xff0c;现在开始。 安装环境 pip install fastapi pip install python-dotenv pip install uv…

文件和注册表关联

注册表是Windows操作系统的信息存储中心&#xff0c;存放着包括计算机硬件配置、已安装软件的设置信息、当前用户的环境设置及某些文件类型与对其进行访问和操作的应用程序之间的联系等重要信息。Windows操作系统早期版本中存放在初始化文件(.ini)中的许多信息现在都存放在注册…

【STM32单片机_(HAL库)】3-4-3【中断EXTI】【智能排队控制系统】排队系统代码框架搭建

3-4-2系统框图及硬件接线 3.软件 beep、exti、gate、LCD1602、led、tasks驱动文件添加GPIO常用函数中断配置流程main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "tasks.h" #include "gate.h"…

联华证券-股票冲高回落的意义:上方抛压恢复

“股票冲高回落”是指股票价格在一段时期内迅速上涨至较高水平后&#xff0c;随后又下跌的现象。这种情况通常表明市场对股票的短期上涨缺乏持续的支撑。以下是冲高回落的主要意义和原因&#xff1a; 1.上方抛压较重 抛压是指大量的卖出订单&#xff0c;这些订单可能在股价达到…

刘海屏的优雅回归?华为Mate 70 Pro定义新美学

在智能手机的发展历程中&#xff0c;华为Mate系列一直是高端旗舰的代表。而今&#xff0c;华为Mate 70 Pro的神秘面纱终于揭开&#xff0c;其回归的刘海屏设计和独特的寰宇舷窗设计&#xff0c;再次将华为的设计理念推向了新的高度。 刘海屏的回归&#xff1a;经典与创新的融合…

用于低质量蒙面人脸识别的一致子决策网络

Consistent Sub-Decision Network for Low-Quality Masked Face Recognition 摘要 提出了一种利用由多个dropout块组成的在线一致性评估结构来获得对应于人脸不同区域的子决策网络&#xff0c;以获得对应于不同面部区域的子决策&#xff0c;并通过加权双向KL散度来约束子决策&…

Transformer模型-5-Multi-Head Attention

上图红色圈中的部分为 Multi-Head Attention&#xff0c;是由多个Self-Attention组成的&#xff0c;虽然Encoder与Decoder中都有Multi-Head Attention&#xff0c;但他们略有区别。Encoder block包含一个 Multi-Head Attention&#xff0c; 而Decoder block包含两个 Multi-Head…

从聊天机器人到智能算法:Facebook AI技术的最新应用

人工智能&#xff08;AI&#xff09;技术的飞速发展正推动社交网络进入一个全新的智能化时代。作为全球领先的社交平台之一&#xff0c;Facebook&#xff08;现已改名为Meta&#xff09;在AI技术应用方面不断创新&#xff0c;推动了从聊天机器人到智能算法的诸多突破。本文将探…

C++第十三弹 -- STL之stack深度剖析与模拟实现

文章索引 前言1. stack的介绍2. stack的使用3. stack的模拟实现4. stackOJ题目4.1 最小栈4.2 栈的压入弹出序列4.3 用栈实现队列 总结 前言 在现代C编程中&#xff0c;STL&#xff08;标准模板库&#xff09;是一个不可或缺的工具。它提供了一套通用的模板类和算法&#xff0c…

Vue 2.x时间转换为北京时间(+8)

文章目录 当前时间格式效果图理想时间格式效果图转换方法总结 当前时间格式效果图 非中国常用时间格式&#xff0c;在上图中给可以看到&#xff0c;选择的时间为&#xff1a;2024-8-26 ~ 2024-8-27&#xff0c;返回结果却是&#xff1a;2024-08-25TXX:XX:XXZ&#xff0c;明显不…