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

引用(C++)

引用

  • 一、引用的基本语法
  • 二、引用的特性
    • 1. 引用必须初始化
    • 引用一旦绑定,就不能更改绑定对象
    • 引用不是指针
  • 三、引用的用途
    • 1. 作为函数参数(传引用)
    • 2. 作为函数返回值(返回引用)
  • 四、常量引用(const引用)
  • 五、引用与指针的对比
  • 六、引用的种类
  • 七、右值引用和移动语义(高级)
  • 总结

C++中的引用(Reference)是C++的一项重要特性,它为变量提供了一个别名。引用本质上是变量的另一种名字,它和原变量绑定在一起,操作引用就等于操作原变量。

一、引用的基本语法

int a = 10;
int& ref = a;  // ref是a的引用

说明:

  • int& ref = a; 声明了一个整型引用 ref,它绑定到变量 a。

  • 从此以后,对 ref 的操作就是对 a 的操作。

二、引用的特性

1. 引用必须初始化

引用在声明时必须立刻绑定到某个变量上,不能晚于声明。

int& ref;  // 错误!引用必须初始化

引用一旦绑定,就不能更改绑定对象

int a = 10;
int b = 20;
int& ref = a;
ref = b;  // 这里是把b的值赋给a,而不是让ref引用b

引用不是指针

  • 引用不能为 null。

  • 引用无需解引用(不像指针需要 *)。

三、引用的用途

1. 作为函数参数(传引用)

避免值传递的拷贝开销,并且允许修改实参。

void swap(int& a, int& b) {int temp = a;a = b;b = temp;
}

2. 作为函数返回值(返回引用)

允许链式操作或修改函数外部的数据。

int& getElement(int arr[], int index) {return arr[index];
}int main() {int nums[3] = {1, 2, 3};getElement(nums, 1) = 100;  // nums[1] 变为100
}

⚠️ 注意:返回局部变量的引用是错误的,会造成悬垂引用!

四、常量引用(const引用)

void print(const int& x) {std::cout << x << std::endl;
}

特点:

  • 可以绑定临时变量或字面值。

  • 不允许通过该引用修改值。

  • 用于提高效率,同时保护数据。

五、引用与指针的对比

特性引用指针
是否必须初始化
是否可变绑定
是否可为null
语法复杂度更简单稍复杂
使用时是否需要解引用符 *

六、引用的种类

  • 左值引用(Lvalue Reference):int& —— 绑定到可取地址的变量。

  • 常量引用(Const Reference):const int& —— 可绑定到常量或右值。

  • 右值引用(C++11引入):int&& —— 用于绑定临时对象,支持移动语义。

七、右值引用和移动语义(高级)

int&& r = 10;  // 右值引用,可以绑定临时值
  • 用于资源的“移动”而不是“复制”。

  • 提高性能,尤其在涉及大对象或资源的场景下。

  • 与std::move搭配使用。

总结

C++引用是一种语法糖,底层通常由指针实现,但使用起来更安全、简洁。掌握引用对理解C++函数调用、内存管理和现代C++特性(如移动语义、完美转发)至关重要。

http://www.dtcms.com/a/279745.html

相关文章:

  • python的微竞网咖管理系统
  • ⽂本预处理(一)
  • volatile 关键字
  • Codeforces Round 787 (Div. 3)(A,B,C,D,E,F,G)
  • DO,VO,DTO.....
  • (二十四)-java+ selenium自动化测试-三大延时等待
  • UI前端与数字孪生融合案例:智慧城市的智慧停车引导系统
  • 苍穹外卖Day4
  • JavaScript进阶篇——第二章 高级特性核心
  • vue笔记4 vue3核心语法和pinia基础使用
  • 【leetcode】326. 3的幂
  • VSCode中使用容器及容器编排docker-compose
  • L1与L2正则化详解:原理、API使用与实践指南
  • FastAPI + gRPC 全栈实践:Windows 开发到 Ubuntu 部署全指南
  • JVM监控及诊断工具-命令行篇
  • ubuntu 22.04 anaconda comfyui安装
  • 8.数据库索引
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘collections’问题
  • WIFI MTU含义 ,协商修改的过程案例分析
  • ansys2021R Fluent 的UDF配置问题
  • 开疆智能EtherCAT转CANopen网关连接磁导航传感器配置案例
  • 《美术教育研究》是什么级别的期刊?是正规期刊吗?能评职称吗?
  • Python项目中Protocol Buffers的应用示例
  • MySQL Innodb Cluster介绍
  • 零基础 “入坑” Java--- 十一、多态
  • Spring Boot + Vue2 实现腾讯云 COS 文件上传:从零搭建分片上传系统
  • 并发编程核心概念详解:进程、线程与协程的本质与差异
  • 解锁HTTP:从理论到实战的奇妙之旅
  • Windows系统使用docker部署项目(有网与离线)
  • LeetCode--45.跳跃游戏 II