news 2026/8/11 15:40:54

c++中引用(P7-P11)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c++中引用(P7-P11)

一、引用
作用:给变量起别名。
语法:数据类型 &别名=原名

#include<iostream>usingnamespacestd;intmain(){//引用基本语法//数据类型 &别名=原名inta=10;//创建引用int&b=a;cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;}

通过别名b,把b的值进行修改。

#include<iostream>usingnamespacestd;intmain(){//引用基本语法//数据类型 &别名=原名inta=10;//创建引用int&b=a;cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;b=100;cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;}

二、引用注意事项
引用必须初始化
引用在初始化后,不可改变。(如果b一开始是a的原名,后面b就不能再变成c的别名。)

#include<iostream>usingnamespacestd;intmain(){//引用基本语法//数据类型 &别名=原名inta=10;//创建引用int&b=a;// cout<<"a="<<a<<endl;// cout<<"b="<<b<<endl;//2.引用在初始化后 ,不可以改变intc=20;b=c;//赋值操作,而不是更改引用cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;cout<<"c="<<c<<endl;}
//输出a=20b=20c=20

三、引用做函数参数
作用:函数传参,可以利用引用的技术让形参修饰实参。
优点:可以简化指针修改实参。
(1)值传递

#include<iostream>usingnamespacestd;//1.值传递voidtest01(inta,intb){inttmp=a;a=b;b=tmp;cout<<"swap01 a="<<a<<endl;cout<<"swap01 b="<<b<<endl;}//2.地址传递voidtest02(int*a,int*b){inttmp=*a;*a=*b;*b=tmp;}//3. 引用传递intmain(){inta=10;intb=20;test01(a,b);cout<<"Main a="<<a<<endl;cout<<"Main b="<<b<<endl;}
//输出swap01 a=20swap01 b=10Main a=10Main b=20

(2)地址传递

#include<iostream>usingnamespacestd;//1.值传递voidtest01(inta,intb){inttmp=a;a=b;b=tmp;cout<<"swap01 a="<<a<<endl;cout<<"swap01 b="<<b<<endl;}//2.地址传递voidtest02(int*a,int*b){inttmp=*a;*a=*b;*b=tmp;cout<<"swap02 a="<<*a<<endl;cout<<"swap02 b="<<*b<<endl;}//3. 引用传递intmain(){inta=10;intb=20;// test01(a,b);//值传递,形参不会修饰实参// cout<<"Main a="<<a<<endl;// cout<<"Main b="<<b<<endl;test02(&a,&b);//地址传递,形参会修饰实参cout<<"Main a="<<a<<endl;cout<<"Main b="<<b<<endl;}
//输出swap02 a=20swap02 b=10Main a=20Main b=10

(3)引用传递

#include<iostream>usingnamespacestd;//1.值传递voidtest01(inta,intb){inttmp=a;a=b;b=tmp;cout<<"swap01 a="<<a<<endl;cout<<"swap01 b="<<b<<endl;}//2.地址传递voidtest02(int*a,int*b){inttmp=*a;*a=*b;*b=tmp;cout<<"swap02 a="<<*a<<endl;cout<<"swap02 b="<<*b<<endl;}//3. 引用传递voidtest03(int&a,int&b){inttmp=a;a=b;b=tmp;// cout<<"swap03 a="<<*a<<endl;// cout<<"swap03 b="<<*b<<endl;}intmain(){inta=10;intb=20;// test01(a,b);//值传递,形参不会修饰实参// cout<<"Main a="<<a<<endl;// cout<<"Main b="<<b<<endl;// test02(&a,&b);//地址传递,形参会修饰实参test03(a,b);//引用传递,形参会修饰实参cout<<"Main a="<<a<<endl;cout<<"Main b="<<b<<endl;}
//输出Main a=20Main b=10

四、引用做函数返回值
作用:引用可以作为函数的返回值存在的。

注意:不要返回局部变量引用。
用法:函数调用作为左值。

#include<iostream>usingnamespacestd;//1.不要返回局部变量的引用int&test01(){inta=10;//局部变量存放在四区中的栈区returna;}//2.函数的调用可以作为左值int&test02(){}//2.函数的调用可以作为左值intmain(){//引用做函数的返回值//1.不要返回局部变量的引用//2.函数的调用可以作为左值int&ref=test01();cout<<"ref="<<ref<<endl;//第一次结果正确,因为编译器做了保留。cout<<"ref="<<ref<<endl;//第二次结果错误,因为a的内存已经释放。}
//输出ref=进程已结束,退出代码为-1073741819(0xC0000005)

函数的调用作为左值

#include<iostream>usingnamespacestd;//1.不要返回局部变量的引用int&test01(){inta=10;//局部变量存放在四区中的栈区returna;}//2.函数的调用可以作为左值//返回静态变量的引用int&test02(){staticinta=20;returna;}//2.函数的调用可以作为左值intmain(){//引用做函数的返回值//1.不要返回局部变量的引用//2.函数的调用可以作为左值// int &ref=test01();// cout<<"ref="<<ref<<endl;//第一次结果正确,因为编译器做了保留。// cout<<"ref="<<ref<<endl;//第二次结果错误,因为a的内存已经释放。//如果函数做左值,那么必须返回引用int&ref2=test02();cout<<"ref2="<<ref2<<endl;cout<<"ref2="<<ref2<<endl;test02()=1000;cout<<"ref2="<<ref2<<endl;cout<<"ref2="<<ref2<<endl;}
ref2=20ref2=20ref2=1000ref2=1000

五、引用的本质

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

#include<iostream>usingnamespacestd;//发现是引用,转换为int * const ref=&avoidfunc(int&ref){ref=1000;//ref是引用,转换为*ref=100}intmain(){inta=10;//自动转换为 int * const ref=&; 指针常量是指针指向不可改,也说明了为什么引用不可更改。int&ref=a;ref=20;//内部发现ref是引用,自动帮我们转换为:*ref=20;cout<<"a:"<<a<<endl;cout<<"ref:"<<ref<<endl;func(a);return0;}
a:20ref:20

六、常量引用

作用:常量引用主要用来修饰形参,防止误操作。
在函数列表中,可以加const修饰形参,防止形参改变实参。

#include<iostream>usingnamespacestd;//打印数据函数voidshowValue(int&val){val=1000;cout<<"val="<<val<<endl;}intmain(){//常量引用//使用场景:用来修饰形参,防止误操作// int a=10;// int &ref=a;//加上const之后,编译器将代码修改 int tmp=10; const int & ref=temp;// const int &ref=10;//引用必须引一块合法的内存空间//// ref=20;//加入const之后变为只读,不可以修改。inta=100;showValue(a);cout<<"main a="<<a<<endl;}
//输出val=1000main a=1000

引用引用是别名,如果修改了引用的值,原名的值也随之修改。所以为了避免误操作,我们把形式参数设成const,也就是只读模式。

#include<iostream>usingnamespacestd;//打印数据函数voidshowValue(constint&val){// val=1000;cout<<"val="<<val<<endl;}intmain(){//常量引用//使用场景:用来修饰形参,防止误操作// int a=10;// int &ref=a;//加上const之后,编译器将代码修改 int tmp=10; const int & ref=temp;// const int &ref=10;//引用必须引一块合法的内存空间//// ref=20;//加入const之后变为只读,不可以修改。inta=100;showValue(a);cout<<"main a="<<a<<endl;}
val=100main a=100
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/11 15:36:55

CAD动态块与参数化设计:构建石材窗台高效绘图流程

你打开CAD软件&#xff0c;准备画一个窗台。这听起来是个简单的任务&#xff0c;无非是几条直线和弧线。但当你面对一个复杂的石材窗台&#xff0c;需要精确计算收口、磨边、下挂尺寸&#xff0c;还要考虑与墙体、窗框的衔接时&#xff0c;事情就变得不那么简单了。你可能会在“…

作者头像 李华
网站建设 2026/8/11 15:35:11

智能体测开Day47

dockerfile 创建镜像产品测试通过后&#xff0c;会将镜像发布到仓库中。产品在测试阶段&#xff0c;还没有测试完成&#xff0c;不能发布到仓库中。开发交付⼀个 dockerfile &#xff0c;还有配套 的⽂件。 docker build 创建镜像后&#xff0c;再创建容器进⾏测试。dockerfile…

作者头像 李华
网站建设 2026/8/11 15:32:29

大模型对话前端第一版:先跑通流式响应和取消

大模型对话前端第一版&#xff1a;先跑通流式响应和取消 第一版大模型对话界面先验证一条主链路&#xff1a;接收流式响应、正确解码、可取消地渲染&#xff0c;并在异常时给出可恢复的提示。本文以流式 Markdown 的前端实现为例&#xff0c;讨论这条链路的最小边界。 fetch 与…

作者头像 李华
网站建设 2026/8/11 15:29:54

AI搜索与知识图谱:构建GEO全链路技能库的架构与实践

1. 项目概述&#xff1a;当AI搜索遇上“GEO全链路技能库” 最近和几个做增长、做运营的朋友聊天&#xff0c;大家普遍有个感觉&#xff1a;现在找资料、学东西&#xff0c;用传统搜索引擎越来越“钝”了。你想了解一个新兴的营销玩法&#xff0c;比如“小红书蒲公英平台最新报备…

作者头像 李华