当前位置: 首页 > news >正文

C++基础 引用

目录

1.引用的基本使用

2.引用的注意事项

3.引用做函数参数

4.引用做函数返回值

5.引用的本质


1.引用的基本使用

        作用:给变量起别名

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

#include <iostream>
using namespace std;


int main()
{
	int a = 10;
	int &b = a;  //创建引用
	b = 20;
	cout << a << endl;
}

结果:

 通过输出结果可以看出通过操作别名b,也能改变变量a的值

2.引用的注意事项

        1.引用必需要初始化

                int &b;  (×)

                int &b=a;  (√)

        2.引用一旦初始化,就不可以更改了

                解释:比如c是a的别名,就不能再是b的别名了

3.引用做函数参数

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

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

比较值传递、地址传递、引用传递:

值传递

#include <iostream>
using namespace std;
#include <string>

//值传递
void swap01(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
	cout << " a= " << a << endl;
	cout << " b= " << b << endl;
}




int main()
{
	int a = 10;
	int b = 20;
	swap01(a, b);
	cout << " a= " << a << endl;
	cout << " b= " << b << endl;
}

结果:

 可以发现值传递中,形参不会修饰实参

地址传递

#include <iostream>
using namespace std;
#include <string>

//地址传递
void swap02(int *a, int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
	cout << " a= " << *a << endl;
	cout << " b= " << *b << endl;
}


int main()
{
	int a = 10;
	int b = 20;
	swap02(&a, &b);
	cout << " a= " << a << endl;
	cout << " b= " << b << endl;
}

结果:

 可以发现地址传递中形参会修饰实参 

引用传递

#include <iostream>
using namespace std;
#include <string>

//引用传递,形参会修饰实参
void swap03(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;
	cout << " a= " << a << endl;
	cout << " b= " << b << endl;
}


int main()
{
	int a = 10;
	int b = 20;
	swap03(a, b);
	cout << " a= " << a << endl;
	cout << " b= " << b << endl;
}

结果:

可以发现引用传递中形参会修饰实参 

4.引用做函数返回值

4.1. 不要返回局部变量引用

#include <iostream>
using namespace std;

int& test01()
{
	int a = 10;
	return a;
}

int main()
{
	int &ref = test01();
	cout << " ref= " << ref << endl;
	cout << " ref= " << ref << endl;
}

结果:

 结果不一样是因为a是局部变量,其存放在栈区,当函数test01执行完毕后就被释放了。

4.2函数的调用可以作为左值从而来被赋值

#include <iostream>
using namespace std;
#include <string>

int& test02()
{
	static int a = 10;
	return a;
}

int main()
{
	int &ref = test02();
	cout << " ref= " << ref << endl;
	cout << " ref= " << ref << endl;

	test02() = 1000;
	cout << " ref= " << ref << endl;
	cout << " ref= " << ref << endl;
}

结果:

 前两个结果一样是因为a是静态变量,其存放在全局区,程序结束后由系统释放。

后来ref的值变为1000是由于 原名a被重新赋了值1000,ref作为一个别名引用的内存的值也发生了变化。

5.引用的本质

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

引用一旦初始化后就不可以发生改变

#include <iostream>
using namespace std;
#include <string>

void func(int& ref)
{
	ref = 100;
}

int main()
{
	int a = 10;
	int& ref = a;  //相当于转换为 int* const ref=&a;
	ref = 20;  //内部发现ref是引用,自动帮我们转换为  *ref=20;

	cout << " a= " << a << endl;
	cout << " ref= " << ref << endl;

	func(a);

}

相关文章:

  • 5分钟教会你如何搭建自己的git仓库
  • 【云原生 | Kubernetes 系列】---PromQL语句
  • 谈谈Boost网络编程(3)—— 一些坑
  • 497. 返回随机非重叠矩形中的一个坐标点
  • Referer和Referrer Policy及图片防盗链
  • ISO7816-3标准ATR解析
  • 谨慎redis的timeout参数
  • PHP 实例 - AJAX 与 XML
  • 期货开户每日无负债结算制度
  • Redis、JVM、并发、MySQL、Java、网络等一个你都“啃”不完,何谈BAT?
  • 详解 docker save 与 docker export 的区别
  • 【华为账号服务】【FAQ】Account Kit常见咨询合集--获取帐号个人信息相关问题
  • 每个人都可以用的开源微信机器人
  • 一幅长文细学华为MRS大数据开发(四)——HBase
  • Vue2、Vue3知识总结---完整版✨
  • [笔记] php常见简单功能及函数
  • Facebook AccountKit 接入的坑点
  • Iterator 和 for...of 循环
  • React+TypeScript入门
  • Selenium实战教程系列(二)---元素定位
  • tab.js分享及浏览器兼容性问题汇总
  • Vue官网教程学习过程中值得记录的一些事情
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 官方解决所有 npm 全局安装权限问题
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 实现菜单下拉伸展折叠效果demo
  • 跳前端坑前,先看看这个!!
  • 我看到的前端
  • 新书推荐|Windows黑客编程技术详解
  • 赢得Docker挑战最佳实践
  • 第二十章:异步和文件I/O.(二十三)
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • # Java NIO(一)FileChannel
  • #pragma data_seg 共享数据区(转)
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (13)Hive调优——动态分区导致的小文件问题
  • (二十四)Flask之flask-session组件
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (十六)一篇文章学会Java的常用API
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (万字长文)Spring的核心知识尽揽其中
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (学习日记)2024.01.19
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)visual stdio 书签功能介绍
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Framework 4.6.2改进了WPF和安全性
  • .net6Api后台+uniapp导出Excel