首页 > 编程语言 >C++基础知识学习笔记(4)——引用

C++基础知识学习笔记(4)——引用

时间:2024-05-25 15:23:28浏览次数:26  
标签:变量 int cout 笔记 基础知识 引用 实参 main C++

学习参考:https://www.bilibili.com/video/BV1et411b73Z?p=89&spm_id_from=pageDriver&vd_source=cc561849591f6a210152150b2493f6f3

引用

作用:给变量起别名
语法:数据类型& 变量 = 原变量;

int main()
{
	int a = 10;
	int& b = a;
	b = 20;
	cout << b << endl;//20
	cout << a << endl;//20
	return 0;
}

引用使用时需要注意:

  1. 引用必须要初始化
    创建引用但不初始化:int &b;//错误的

  2. 引用初始化后就不能再修改
    不能再让它成为别的变量的引用了。
    尝试更改,其实是赋值操作:

int main()
{
	int a = 10;
	int b = 1;
	int& c = a;
	c = b;//赋值操作(为a、c赋值为1),而不是更改引用

	cout << a << endl;//1
	cout << b << endl;//1
	cout << c << endl;//1
	return 0;
}

引用做函数参数

作用:函数传参时,用引用技术让形参修饰实参,让形参是实参的别名
优点:可以简化指针,可以修改实参(达到地址传参的效果)。

void swap(int *a, int *b) {
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
void swap2(int &a, int& b) {
	int tmp = a;
	a = b;
	b = tmp;
}
int main()
{
	int a = 10;
	int b = 1;
	cout << a << "," << b << endl;
	swap(&a, &b);
	cout << a << "," << b << endl;//1,10
	swap2(a, b);
	cout << a << "," << b << endl;//10,1
	return 0;
}


引用本质上是指针的伪装,是指针的语法糖:https://zhuanlan.zhihu.com/p/621684658
这里的&是变量声明的一部分,应该离数据类型近一点比较合适。
这个别名只在源代码层面存在,在编译后实际上还是原变量,不会多产生一个变量。

引用做函数返回值

  • 不要返回局部变量的引用

image
image

  • 函数的调用可以作为左值

image

int& get() {
	static int a = 20;
	return a;
}
int main()
{
	int& ref = get();
	cout << ref << endl;//20
	get() = 1;
	cout << ref << endl;//1
	return 0;
}

静态变量对全局区,此区域的数据在程序结束后释放。所以上面代码中静态变量可以从函数中返回,如果是局部变量则不行。

引用的本质

本质:在c++内部是指针常量。.

image

常量引用

作用:const修饰形参引用,防止误操作、防止形参修改实参。

image

就是相比值传递,引用传递可以修改实参,但是有时不想在引用传递中允许修改实参,就加一个const修饰。

image

标签:变量,int,cout,笔记,基础知识,引用,实参,main,C++
From: https://www.cnblogs.com/redcode/p/18212367

相关文章

  • tracer ftrace笔记(4)—— events.rst 翻译
    基于msm-5.4Android-12一、翻译=============事件追踪=============:作者:TheodoreTs'o:更新:李泽凡和汤姆·扎努西 1.简介===============无需创建自定义内核模块即可使用跟踪点(请参阅Documentation/trace/tracepoints.rst)来使用事件跟踪基础设施注册探测函数。并非......
  • 学习笔记-主席树
    学习笔记-主席树主席树,就是可持久化权值线段树,也叫函数式线段树引入考虑如下问题:给定一个数列,查询其中第k大值显然,我们可以建一棵权值线段树,直接在上面二分就好了,即对于每个结点,查看它左子树的结点数量是否大于k,设为\(sum\)如果\(sum\gek\),则第k个结点在其左子树中,否则......
  • C++ - 比较两个浮点数大小
    简介两个浮点数不能直接使用 ==来确定相等,因为浮点数精度可能导致微小的误差 方法一:使用std::abs()函数来比较两个浮点数的差值是否小于一个非常小的阈值floata=1.5;floatb=2.3;floatepsilon=1e-9;if(std::abs(a-b)<epsilon){cout<<"aiseq......
  • C++基础知识学习笔记(3)
    资料来源https://www.bilibili.com/video/BV1et411b73Z?p=84&vd_source=cc561849591f6a210152150b2493f6f3核心内容程序的内存模型代码区全局区在函数外面声明了全局变量,在main函数里面创建了局部变量,打印了其地址:静态变量:在普通变量前面加一个static,属于静态变量。静......
  • Minecraft中BossBar、Recipe的底层实现与扩展应用(学习笔记)
    看到有位博主写得很不错,直接上链接:《进度条与自定义合成表》本人在学习这篇博客的基础上进行实践与验证(使用1.12Bukkit接口开发),对上面的文件做几点总结与补充:正如文中所说,一定要记得在插件卸载时对注册的进度条和合成配方进行注销。文中所说的对进度条进行卸载的方法Buk......
  • 深度学习笔记03_pytorch实现天气识别
    ......
  • 算法学习笔记——动态规划.最长上升/下降子序列 2024.5.24
    LanqiaoOJ 773这道题是一道动态规划的题目,主要考察最长上升/下降子序列,难度中等,但是对思维的考察比较重要,特别是如何解决其第二问题目描述某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以......
  • 算法学习笔记——深度优先搜索DFS 2024.5.25
    LanqiaoOJ141此题是一道比较经典的搜索题目,这里采用深度优先搜索的方法题目描述X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?......
  • 【C++】回文数判断(for循环,简易思路)
    #include<stdio.h>#include<string.h>#include<iostream>usingnamespacestd;intmain(){chara[1001];intn,i,j;cin>>a;//输入字符串,注意:这里不会处理空格n=strlen(a);/......
  • 使用nrf sniffer抓包笔记
    说明​ 在做BLE开发时候难免会遇到要抓空中包分析问题的情况,这种时候一般要使用抓包器来进行分析。目前来说抓包器比较专业的如Ellisys那种,一台要几十万人民币,用过几次确实牛逼,但是太贵重了。而便宜点的就是用各家平台Dongle做的抓包器,廉价也够用了。早年比较流行的是TICC2540的......