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

04. 引用

1.引用的基本定义与核心特性

2.引用的常见用法

3.引用 vs 指针


1.引用的基本定义与核心特性

c++中引用是变量的"别名",就像一个人有本名和外号,引用和原变量指向同一块内存地址,操作引用就等同于操作原变量1).语法格式// 语法:类型& 引用名 = 原变量名;inta=10;int&ra=a;// ra是变量a的引用(别名)"&是引用标识符, 必须和类型写在一起"
2).核心特性 a.必须初始化 声明引用时,必须绑定到一个已存在的变量,不能"悬空"b.不可改绑 初始化后,引用永远指向最初绑定的变量,无法切换指向 c.引用无独立内存,引用本身不占用额外内存,只是变量的别名;不能引用NULL,必须绑定有效变量,不像指针可以指向NULL

2.引用的常见用法

1).基础用法:操作引用=操作原变量#include <iostream>usingnamespacestd;intmain(){intnum=100;int&ref_num=num;// 定义num的引用// 操作引用,原变量也会变ref_num+=50;cout<<"num = "<<num<<endl;// 输出:num = 150cout<<"ref_num = "<<ref_num<<endl;// 输出:ref_num = 150cout<<"&num = "<<&num<<endl;// 输出num的地址cout<<"&ref_num = "<<&ref_num<<endl;// 输出和num相同的地址return0;}

2).引用作为函数参数 核心优势:避免值传递的拷贝开销(尤其对大对象,如类、数组),同时比指针更简洁、安全(无需解引用*)
#include <iostream>usingnamespacestd;// 1. 值传递:拷贝新变量,修改不影响原变量voidchangeByValue(intx){x=200;}// 2. 指针传递:修改原变量,但需要解引用,语法稍繁琐voidchangeByPointer(int*x){*x=200;}// 3. 引用传递:修改原变量,语法简洁,无拷贝voidchangeByReference(int&x){x=200;}intmain(){inta=100;changeByValue(a);cout<<"值传递后:"<<a<<endl;// 输出:100(无变化)changeByPointer(&a);cout<<"指针传递后:"<<a<<endl;// 输出:200(有变化)a=100;// 重置changeByReference(a);cout<<"引用传递后:"<<a<<endl;// 输出:200(有变化)return0;}

3).常引用(const引用):"只读的别名, 如果不想通过引用修改原变量, 可以用const修饰引用"a.禁止通过常引用修改原变量(原变量本身仍可修改)b.可以绑定常量、临时值(普通引用不行)
#include <iostream>usingnamespacestd;intmain(){inta=100;constint&const_ref=a;// 常引用,只读// const_ref = 200; // 错误!常引用不能修改原变量a=200;// 允许:原变量本身可改,const_ref会同步变化cout<<const_ref<<endl;// 输出:200// 常引用可以绑定临时值(普通引用不行)constint&temp_ref=10+20;cout<<temp_ref<<endl;// 输出:30return0;}

4).引用作为函数返回值 注意:"绝对不能返回局部变量的引用(局部变量在函数结束后销毁, 引用会悬空, 导致未定义行为)"正确用法:返回全局变量、静态变量或类成员的引用(生命周期长的变量)
#include <iostream>usingnamespacestd;// 全局变量(生命周期贯穿程序)intglobal_num=100;// 返回全局变量的引用int&getGlobalNum(){returnglobal_num;}// 错误示例:返回局部变量的引用(禁止!)int&getLocalNum(){intlocal_num=200;returnlocal_num;// 函数结束后local_num销毁,引用悬空}intmain(){// 正确用法:通过返回的引用修改全局变量getGlobalNum()=300;cout<<global_num<<endl;// 输出:300return0;}

3.引用 vs 指针

http://www.cnnetsun.cn/news/720023.html

相关文章:

  • 当AI刺破泡沫:算力瓶颈、能源战争与资本主义的“物理转向”
  • YOLOv11魔改高效涨点 | 注意力篇 | DAT注意力:可变形自注意力,结合变形卷积之魂,动态捕捉全局核心特征,让 Transformer 拥有“动态猫眼”,精准锁定目标,彻底疯狂!!!
  • SSM272的交通事故档案管理系统
  • SSM296的汽车租赁系统vue
  • 【AIGC】2025年12月13日 AutoMV: Automatic Multi-Agent System for Music Video Generation 1:介绍
  • 【AIGC】2025年12月13日 AutoMV: Automatic Multi-Agent System for Music Video Generation 2:论文
  • 知光项目对象存储模块
  • 大数据领域数据服务的用户需求挖掘方法
  • Python:wxauto或PyOfficeRobot的使用
  • FPGA实现万兆网络协议栈UDP/TCP/IP连续16小时无丢包传输
  • 超实用!二维码条形码生成打印软件C#源码分享
  • 三菱FX3U与欧姆龙E5CC温控器通讯控制实战
  • 三菱fx3u模拟量FB:打开模拟量控制新世界
  • 当一个新的观察者诞生,它所见的世界,已非旧世界
  • SSM236的动漫周边商城vue多商家
  • 通过WiFI远程采集导航磁场信号
  • MonkeyCode+cpolar,让国产 AI 编程助手随时随地用
  • 基于FPGA的图像形态学腐蚀处理Verilog开发与开发板硬件测试
  • 公路修建(洛谷P1265)
  • 技术必看:Agent不是低代码工具,而是运行时机制,彻底理解智能体本质,建议收藏反复研读
  • 【必藏】智能体“失忆“问题破解:记忆管理技术与多智能体协同方案
  • Navicat Premium Mac终极重置指南:告别试用期限制的简单方法
  • 【WSL2】连接USB设备
  • ExifToolGUI完整指南:高效管理照片元数据与GPS定位的终极解决方案
  • FinBERT详解
  • 英雄联盟内存换肤终极指南:零风险安全换肤快速上手
  • 如何在Mac上畅玩iOS应用:PlayCover完全使用手册
  • 5分钟掌握开源H5编辑器:零基础快速制作专业移动端页面
  • 基于Springboot+Vue的企业数据资产登记系统(源码+lw+部署文档+讲解等)
  • 碧蓝航线终极皮肤解锁完整教程