C++中引用处理的基本方法

 更新时间:2022年12月21日 12:08:19   作者:莫浅子  
引用不是新定义了一个变量,而是给已经存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,他和他引用的变量共用一块内存空间,下面这篇文章主要给大家介绍了关于C++中引用处理的基本方法,需要的朋友可以参考下

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;

补充:引用和指针的区别(重要)

从底层汇编的角度来说,引用和指针是没有区别的,都是以存地址的方式实现的(了解即可)

不同点:

  1. 引用概念上是定义一个变量的别名,指针是存储一个变量地址。
  2. 引用定义的时候必须初始化,而指针没有要求。
  3. 引用在初始化一个实体后,就不能再引用其他实体,但指针可以在任何时候指向任何一个同类型的实体。
  4. 没有NULL引用,但有NULL指针。
  5. 引用比指针使用起来更安全
  6. 再sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下是4)
  7. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。
  8. 有多级指针,但没有多级引用
  9. 访问实体方式不同,指针需要解引用,引用的话编译器会自己处理。

总结

到此这篇关于C++中引用处理的文章就介绍到这了,更多相关C++引用处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现航班售票系统 C语言实现航班管理系统

    C语言实现航班售票系统 C语言实现航班管理系统

    这篇文章主要为大家详细介绍了C语言实现航班售票系统,C语言实现航班管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • 解决Qt设置QTextEdit行高的问题

    解决Qt设置QTextEdit行高的问题

    这篇文章介绍了Qt设置QTextEdit行高的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • C++ 将一个文件读入数组再读出数组的方法

    C++ 将一个文件读入数组再读出数组的方法

    今天小编就为大家分享一篇C++ 将一个文件读入数组再读出数组的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • C语言深入分析数组指针和指针数组的应用

    C语言深入分析数组指针和指针数组的应用

    在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活
    2022-04-04
  • c语言实现数组循环左移m位

    c语言实现数组循环左移m位

    这篇文章主要介绍了c语言实现数组循环左移m位,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • VS2022 Git提交代码的实现

    VS2022 Git提交代码的实现

    本文主要介绍了VS2022 Git提交代码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Visual Studio Community 2022(VS2022)安装图文方法

    Visual Studio Community 2022(VS2022)安装图文方法

    这篇文章主要介绍了Visual Studio Community 2022(VS2022)安装方法,本文分步骤通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • C语言编程深入理解取整取余取模问题示例分析

    C语言编程深入理解取整取余取模问题示例分析

    这篇文章主要为大家介绍了C语言编程深入理解取整取余取模问题的示例分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • 关于vector迭代器失效的几种情况总结

    关于vector迭代器失效的几种情况总结

    下面小编就为大家带来一篇关于vector迭代器失效的几种情况总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • 使用C++构建一个优先级队列的实现

    使用C++构建一个优先级队列的实现

    优先级队列是一种特殊的队列数据结构,本文主要介绍了使用C++构建一个优先级队列的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02

最新评论