C++中的引用处理
2023-02-18 16:38:06 时间
目录
1.引用的基本用法
引用是C++对C的重要扩充。在c/c++中,指针用法基本一致。但是C++增加了另一种给函数传递地址的途径,这就是引用传递,也存在去其他语言,并不会是C++独有。
1.1 引用的实质
原类型 &别名 = 旧名
1.2 引用的用法
注意事项:
引用一旦初始化,不能更改引用的指向 引用定义时必须初始化 不能引用NULL 引用可以引用任意类型包括数组 &在等号的左边是引用,在等号的右边是取地址
代码
#include <iostream>
using namespace std;
void test01()
{
int a = 10;
int& b = a;
b = 100;
cout << a << endl;
int c = 1;
//b = c; 代表把c的值赋值给b 不是给c取别名为b
//int &d; 引用定义时必须初始化
}
void test02()
{
int a[5] = { 1,2,3,4,5 };//int(&arr)[5] = a;
typedef int ARR[5]; //type & 别名 = 旧名
ARR & arr = a;
for (int i = 0; i < 5; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
test02();
return 0;
}
2.函数中的引用
引用可以作为函数的形参 ,不能返回局部变量的引用
在C语言中我们记得我们可以用指针解决函数不能交换值的问题。
swap(int *x ,int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
void test01()
{
int a = 10;
int b = 20;
swap(&a,&b);
}
在C++中可以也使用引用很好的解决这个问题
void swap_ref(int &x, int &y)// int &x =a, int &y =b
{
int tmp = x;
x = y;
y = tmp;
}
void test01_ref()
{
int a = 10;
int b = 20;
swap_ref(a, b);
}
如果想开辟数组地址,用指针的做法是
//形参是指针 引用
void get_mem(int **q)
{
*q = (int *)malloc(5 * sizeof(int));
}
void test03()
{
int *p = NULL;
get_mem(&p);
get_mem_ref(p);
}
用引用可以这样做
void get_mem_ref(int * &q)//int * (&q) = p
{
q = (int *)malloc(5 * sizeof(int));
}
void test03()
{
int *p = NULL;
get_mem(&p);
get_mem_ref(p);
}
能不能返回一个变量的引用 看这个变量的空间是否被释放了
int & test04()
{
//能不能返回一个变量的引用 看这个变量的空间是否被释放了
static int b = 100;
int a = 10;
//return a;//err 不能返回局部变量的引用
return b;//可以返回静态的变量的引用
}
3.引用的本质
引用的本质是一个指针常量
type &b = a; 编译器底层这么实现的: type *const b = &a
比如你写
int &b = a; // 编译器优化为 int * const b = &a
4.指针的引用
套用引用公式: type &q = p
如果想改变p的内容,函数传递的时候按照指针的方法传的是地址,如下: get_mem(&p);
如果你想用引用的方法直接传就行
void test03() { int *p = NULL; get_mem(&p); get_mem_ref(p); }
5.常量引用
const type &p = q;
常量引用代表不能通过引用去修改引用标识的那块空间
int a = 10;
const int &b = a;
如果你再去 让 b = 1000;就是错误的
虽然不能引用常量,但是可以加const来引用
int &b = 100; //不能引用常量
改为
const int &b = 1;
原理上是 等价于,相当于让tmp = 1
int tmp =1 ,const int &b= tmp;
相关文章
- 编写 Django 应用单元测试
- 上周 GitHub 热点速览 vol.07:GitHub 官方 CLI beta 版已发布
- Django Haystack 全文检索与关键词高亮
- 宅在家学不进去吗?试试这些 GitHub 上简单易学的游戏项目吧
- 《HelloGitHub》第 46 期
- Google 开源的 Python 命令行库:fire 实现 git 命令
- 拥有 GitHub 开源项目的小伙伴,免费申请 JetBrains 全家桶的全流程详解
- Django 博客实现简单的全文搜索
- Google 开源的 Python 命令行库:深入 fire(二)
- 开启 Django 博客的 RSS 功能
- Google 开源的 Python 命令行库:深入 fire(一)
- 《HelloGitHub》第 45 期
- Google 开源的 Python 命令行库:初探 fire
- 稳定易用的 Django 分页库,完善分页功能
- Python 命令行之旅:使用 click 实现 git 命令
- 《HelloGitHub》第 44 期
- 通过 Django Pagination 实现简单分页
- 使用 Django 项目中的 ORM 编写伪造测试数据脚本
- Python 命令行之旅:使用 docopt 实现 git 命令
- 《HelloGitHub》第 43 期