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

C++中的引用

        E3`1、弄清楚什么是引用

1、引用(Reference,可以直译为参考)可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据

2、引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其它数据,这有点类似于常量(const 变量)(同时还有点指针常量的味道,即定义时必须初始化,然后不能再去引用其他变量)

先看一段代码:

#include <iostream>
using namespace std;
int main() {int a = 99;int &r = a;cout << a << ", " << r << endl;cout << &a << ", " << &r << endl;return 0;
}

这里语句 int &r = a;就是对a的引用。查看代码运行的结果:

 运行结果:
99, 99
0x28ff44, 0x28ff44

这里就可以看出来,

(1)这里的&不是取地址。这其实也很好理解,当&出现在等式的右边,就会被认为是取地址符号,当&出现在等式左边,就可以认为是引用符号。

(2)从运行结果上看,r和a的地址都是一样的,说明编译器并没有给r另外开辟一个地址,我们根据代码一步一步来分解:

    int a = 99;    //为变量a分配内存
int &r = a;    //不会为a分配内存
cout << a << ", " << r << endl;   //后续代码中遇到a或r,直接调用为a分配的地址即可
cout << &a << ", " << &r << endl;

2、可以引用哪些类型

2.1 基本数据类型

C++ 的基本数据类型包括整型(intshortlonglong long等)、浮点型(floatdouble 、long double)、字符型(char)、布尔型(bool)等,这些类型的变量都可以通过引用进行关联。

2.2 指针数据变量的引用

直接看代码:

#include <iostream>
using namespace std; //这也构成了一条语句,末尾的“;”不能少
int main() {int* ptr = new int(5);int*& ptrRef = ptr;  // 引用一个指针变量*ptrRef = 10;        // 通过引用修改指针所指向的值cout << "*ptrRef: " << *ptrRef << endl;  //输出 *ptrRef: 10std::cout << "*ptr: " << *ptr << endl;  // 输出 *ptr: 10,另外这里的写法std::有点多余delete ptr;return 0;
} 

int*& ptrRef = ptr;  引用指针变量时,&引用符号,要放在*号和变量名之间

*ptrRef = 10;  和指针用法一致。

直接使用 ptrRef,则代表所存储开辟变量的地址。

2.3数组引用

还是直接看代码:

#include <iostream>
void printArray(int(&arr)[5]) {  // 引用一个int类型的数组for (int i = 0; i < 5; ++i) {std::cout << arr[i] << " ";}std::cout << std::endl;
}
int main() {int myArray[] = {1, 2, 3, 4, 5};printArray(myArray);  // 输出 1 2 3 4 5return 0;
} 

引用作为形参时int(&arr)[5],其中拆解为以下几个点

(1)这个&arr是要被包含在()括号中的,

(2)方括号中和其中的数字5,也是必不可少的。相当于指定了数组的长度

(3)这里和数组指针作为形参时int* arr 或者 int arr[]是不一样的

(4)模板函数中,这个形参不是必须要指定长度的的,这个暂时不清楚,还没学到模板函数

2.4 引用结构体和类类型

可以引用结构体对象或类的对象,在函数参数传递中使用结构体或类的引用,能避免对象的复制开销,提高效率,同时也能通过引用修改对象内部成员。

代码如下:

#include <iostream>
#include <string>
struct Person {std::string name;int age;
};
void updatePerson(Person& p) {  // 引用一个Person结构体对象p.age++;
}
int main() {Person p = {"Alice", 25};updatePerson(p);std::cout << "Updated age: " << p.age << std::endl;  // 输出 Updated age: 26return 0;
} 

引用类对象与类对象不一样的地方在于,中间会加上&符号

3、引用的一些注意事项

(1)引用在定义时需要添加&,在使用时不能添加&,使用时添加&表示取地址。(从上文的代码中也可以看出)

(2)引用声明时,也需要进行类型声明,如int

(3)引用也可以作为函数形参

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

相关文章:

  • Linux 系统下 ZONE 区域的划分
  • 网站内部链接优化方法cpanel伪静态wordpress
  • LangChain 表达式语言核心组合:Prompt + LLM + OutputParser
  • 【管理多版本Python环境】Anaconda安装及使用
  • AI修图革命:IOPaint+cpolar让废片拯救触手可及
  • 读书笔记整理--网络学习与概念整合
  • 老铁推荐个2021网站好吗wordpress 入口文件
  • 前端自动化部署全流程(Jenkins + Nginx)
  • 音视频处理(一):什么决定了你的音色?声音的三要素
  • python+uniapp基于微信小程序的助眠小程序
  • ELK运维之路(Filebeat第二章-7.17.24)
  • (未成功)Chrome调试避免跳入第三方源码(设置Blackbox Scripts、将目录添加到忽略列表、向忽略列表添加脚本)
  • 网站建设毕业答辩问题学建设网站首页
  • 大模型在企业云计算领域的核心应用能力要求
  • CloudDM:一站式数据库开发管理工具
  • 适合用struts2做的网站批量发布网站
  • Azure OpenAI 错误码处理完整指南
  • NuxtJS从0到1开发SSR项目-添加Nuxt UI
  • 如何检查本地是否存在 Docker 镜像 ?
  • 查询工程建设项目的网站泉州网站制作平台
  • 单序列和双序列问题——动态规划
  • 【建模与仿真】基于TPE-SVM的乳腺癌诊断可解释人工智能方法
  • 2.5、物联网设备的“免疫系统”:深入解析安全启动与可信执行环境
  • 【小白笔记】理解 PyTorch 和 NumPy 中的张量(Tensor)形状变化unsqueeze(0)
  • 消息中间件选型的艺术:如何在RocketMQ、Kafka、RabbitMQ中做出正确决策
  • Java 反射机制核心类详解:Class、Constructor、Method、Field
  • 如何建立一个网站查询数据韶关市住房和城乡建设管理局网站
  • 【CSS 技巧】实现半透明边框的正确方式 —— 使用 background-clip: padding-box
  • CSS学习笔记(一):Flex布局全攻略
  • 【CSS 技巧】CSS 多层阴影(box-shadow)炫酷边框效果详解