C++中引用处理的基本方法
莫浅子 人气:01.引用的基本用法
引用是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;
补充:引用和指针的区别(重要)
从底层汇编的角度来说,引用和指针是没有区别的,都是以存地址的方式实现的(了解即可)
不同点:
- 引用概念上是定义一个变量的别名,指针是存储一个变量地址。
- 引用定义的时候必须初始化,而指针没有要求。
- 引用在初始化一个实体后,就不能再引用其他实体,但指针可以在任何时候指向任何一个同类型的实体。
- 没有NULL引用,但有NULL指针。
- 引用比指针使用起来更安全
- 再sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下是4)
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。
- 有多级指针,但没有多级引用
- 访问实体方式不同,指针需要解引用,引用的话编译器会自己处理。
总结
加载全部内容