news 2026/7/8 6:56:10

c++初阶入门(引用,引用的特性,引用的使用,引用的使用)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c++初阶入门(引用,引用的特性,引用的使用,引用的使用)

目录

引用

引用的特性

引用的使用

const 引用

权限缩小(合法)

权限放大(非法)


引用

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

类型& 引用别名=引用对象;

// C++ 标准对 main() 函数有特殊规定:main() 函数是唯一允许不写 return 语句的函数。

引用的特性

引用在定义时必须初始化。

一个变量可以有多个引用。

引用一旦引用一个实体,就不能再引用其他实体。

//引用的功能 //1.做函数的形参,修改形参影响实参 using namespace std; void swap(int& a, int& b) { int tmp = a; a = b; b = tmp; } ////2.做函数形参,减少拷贝,提高效率 struct A { int a[100]; int b; // //... }; // void func(struct A* aa) {} //// 引用功能2:做函数形参,减少拷贝,提高效率 void func(struct A& aa) {} int main() { int x = 1, y = 2; cout << x << " " << y << endl; swap(x, y); cout << x << " " << y << endl; struct A a; // //类型struct A 函数名为a func(&a); func(a); return 0; }

引用的使用

引用在实践中主要用于引用传参引用做返回值中,以减少拷贝、提高效率,并在改变引用对象时同时改变被引用对象。

引用传参与指针传参功能类似,但引用传参相对更方便一些。

引用返回值的场景相对比较复杂,我们在这里简单介绍了一下场景,还有一些内容在后续类和对象章节中会继续深入讲解。

引用和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++ 的引用与其他语言的引用(如 Java)有很大区别,除了用法,最大的区别是 C++ 引用定义后不能改变指向,而 Java 的引用可以改变指向。

一些主要用 C 代码实现的数据结构教材中,使用 C++ 引用替代指针传参,目的是简化程序,避开复杂的指针,但是很多同学没学过引用,导致一头雾水。

int func() { int ret; return ret; } ////返回的是拷贝的临时变量 int& SLAT(SL& ps, int i) { assert(i < ps.size); return ps.arr[i]; } ////传引用返回 返回的是别名 并没有创建临时对象 可以对其进行修改

const 引用

可以引用一个 const 对象,但是必须用 const 引用。const 引用也可以引用普通对象,因为对象的访问权限在引用过程中可以缩小,但是不能放大。

引用权限只能缩小、不能放大

权限缩小(合法)

普通对象可以绑定const 引用

int a = 10; const int& ra = a; // 合法

原对象a:可读、可修改ra:只能读,不能改

相当于访问权限收窄,C++ 允许。

权限放大(非法)

const对象不能绑定普通非const引用:

const int a = 10; int& ra = a; // 编译报错!
  • 原对象a:只读ra允许读写

  • 权限变大,破坏常量的不可修改特性,直接禁止。

需要注意的是,类似int& rb = a*3;double d = 12.34; int& rd = d;这样的场景中,a*3的结果保存在一个临时对象中,int& rd = d也是类似,在类型转换中会产生临时对象存储中间值。也就是说,rbrd引用的都是临时对象,而 C++ 规定临时对象具有常性,所以这里就触发了权限放大,必须用常引用才可以。

临时对象的特殊性:自带常性

临时对象是编译器自动创建、没有名字、生命周期极短的中间变量(表达式结果、类型转换中间值),C++ 规定所有临时对象都是 const 性质

所谓临时对象,就是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象,C++ 中把这个未命名对象叫做临时对象。

表达式运算产生临时:

int a = 2; int& rb = a * 3; // 报错
int main() { int x = 0; int& r1 = x; // // 权限可以缩小 // //r1是x的别名 const int& r3 = x; // //r3缩小权限 const int y = 1; // // 权限不能放大 int& r2 = y; const int& r2 = y; // // // 权限有没有放大?没有 int z = y; // // // 指针和引用才涉及权限缩小和放大 const int* p1 = &y; // // 权限不能放大 int* p2 = p1; const int* p2 = p1; int* p3 = &z; // // 权限可以缩小 const int* p4 = p3; // // // // return 0; }

这是一些记忆的零碎知识点:

传值传参调用拷贝构造——

后定义的先析构。

如果要显式地写析构,就要写拷贝构造。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/8 6:53:50

BLDC电机FOC控制:原理、实现与优化实践

1. 项目背景与核心挑战在工业自动化、无人机和电动汽车等领域&#xff0c;无刷直流电机&#xff08;BLDC&#xff09;因其高效率、长寿命和低噪音特性&#xff0c;正逐步取代传统有刷电机。但实现精确的BLDC控制面临三大技术难点&#xff1a;换相时序的精确控制&#xff08;传统…

作者头像 李华
网站建设 2026/7/8 6:51:38

使用Docker安装Neo4j

【PyCharm】远程本地的WSL2如何配置copilot的Tab不冲突爬虫反反爬1Leetcode 3698. Split Array With Minimum Difference从“氛围编程“到“氛围研究“&#xff1a;OpenAI的GPT-5与未来自动化研究之路Spring Boot整合缓存——Ehcache缓存&#xff01;超详细&#xff01;论文阅读…

作者头像 李华
网站建设 2026/7/8 6:49:48

实时渲染:Lumion保姆级安装教程与下载步骤分享

想必大家不会感到陌生&#xff0c;Lumion是设计师们比较常用的实时3D建筑可视化渲染软件‌工具&#xff0c;专为建筑师、景观设计师及规划师打造&#xff0c;核心优势在于‌极速GPU渲染、海量内置资产库及所见即所得的工作流‌&#xff0c;无需复杂参数即可生成高清效果图、动画…

作者头像 李华
网站建设 2026/7/8 6:47:39

Spring Boot 3.4 新特性全解析

Spring Boot 3.4 新特性全解析 前言 Spring Boot 3.4 作为 Spring Boot 3.x 系列的重要版本&#xff0c;在 2024 年底正式发布。该版本基于 Spring Framework 6.2 构建&#xff0c;带来了诸多令人期待的新特性与改进。本文将全面解析这些核心变化&#xff0c;帮助开发者快速了…

作者头像 李华
网站建设 2026/7/8 6:44:50

【从0到1构建一个ClaudeAgent】协作-Worktree+任务隔离 _

任务板管 "做什么" 但不管 "在哪做"。解法: 给每个任务一个独立的 git worktree 目录, 用任务 ID 把两边关联起来。"各干各的目录, 互不干扰"&#xff0c;任务管目标,&#xff0c;worktree 管目录&#xff0c;按 ID 绑定。Java实现代码javapubli…

作者头像 李华
网站建设 2026/7/8 6:44:41

通达信缠论量化插件:5分钟快速掌握专业级技术分析的完整指南

通达信缠论量化插件&#xff1a;5分钟快速掌握专业级技术分析的完整指南 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 还在为复杂的缠论分析而烦恼吗&#xff1f;这款通达信缠论量化插件将彻底改变你的…

作者头像 李华