目录
一 、入门前言
二、引用引用
1、入门引用的引用概念
2、引用特性
3、入门使用场景
3.1、引用做参数
3.2、入门做返回值
4 、引用传值、入门传引用效率比较
值和引用作为参数的引用性能比较
值和引用作为返回值类型的性能比较
5 、常引用
6 、入门引用和指针的引用区别
上一篇文章我们讲解了 C++ 的入门命名空间 、缺省参数、引用函数重载等内容,接下来我们继续讲解引用相关的入门知识。
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间。
需要注意的是:引用类型必须和引用实体是同种类型的。
目的是让形参的改变影响实参。
例一、
我们在学习C语言函数时,一定写过交换函数,用来实现两个数值的交换:
void Swap(int* x, int* y){int tmp = *x;*x = *y;*y = tmp;}
交换函数中参数一定是以指针形式存在的。因为如果不是指针,那么形参的改变不会影响实参,自然也就无法实现实参之间的交换 。
学了C++之后,我们又多了一种方法可以实现两值交换,那便是引用:
void Swap(int& x, int& y){int temp = x;x = y;y = temp;}
此时函数调用所传递的形参是实参的别名,所以使用实参的别名来交换数值,可以影响到实参 。
例二 、
在学习链表过程中,因为在进行插入删除操作时有可能需要改变头节点的指针,所以我们之前都是采用传递二级指针的方法实现的。
typedef struct Node{struct Node* next;int val;}Node, *PNode;void PushBack(Node** phead, int x){Node* newnode = (Node*)malloc(sizeof(Node));if(*phead == NULL){*phead = newnode;}//.............}int main(){Node* head = NULL;PushBack(&head, 1);PushBack(&head, 2);PushBack(&head, 3);return 0;}
使用引用的话就不需要传递二级指针了,因为传递过去的形参其实是实参的别名,改变形参可以改变实参 。
typedef struct Node{struct Node* next;int val;}Node, *PNode;void PushBack(Node*& phead, int x){Node* newnode = (Node*)malloc(sizeof(Node));if(phead == NULL){phead = newnode;}//.............}int main(){Node* head = NULL;PushBack(head, 1);PushBack(head, 2);PushBack(head, 3);return 0;}
目的是:
在C语言中,我们调用函数获取返回值是通过临时变量来传递的 。因为函数栈帧在函数调用结束后会被销毁,栈帧中的值无法直接被传递,具体相关知识可见这篇文章:
int Count(){int n = 0;n++;return n;}int main(){int ret = Count();return 0;}
如果返回值占据空间较小,那么通常由寄存器来充当临时变量 。如果返回值占据空间较大,那么这个临时变量会提前在main函数栈帧中开辟好 。
现在我们把 n 创建为一个静态变量