目录
一、引用
引用不是定义一个新的变量,而是给已存在的变量取了个别名,编译器不会给引用变量开辟内存空间,它和它引用的变量共用一块内存空间。
格式:
cpp
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int& b = a;
cout << &a << endl;
cout << &b << endl;
return 0;
}


(一)引用的功能1:做函数形参,修改形参影响实参
cpp
void swap(int* p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void swap(int& p1, int& p2)
{
int tmp = p1;
p1 = p2;
p2 = tmp;
}
(二)引用的功能2:做函数形参,减少拷贝,提高效率
cpp
struct A {
int a[100];
int b;
};
void func(struct A* aa)
{
}
void func(struct A& aa)
{
}
(三)引用的功能3:引用做返回值类型,修改返回对象
(四)引用的功能4:引用做返回值类型,减少拷贝,提高效率
cpp
typedef struct SeqList
{
int* a;
int size;
int capacity;
}SL;
void SLInit(SL& sl, int n = 4)
{
sl.a = (int*)malloc(n * sizeof(int));
// ...
sl.size = 0;
sl.capacity = n;
}
void SLPushBack(SL& sl, int x)
{
// ...扩容
sl.a[sl.size] = x;
sl.size++;
}
int& SLAt(SL& sl, int i)
{
assert(i < sl.size);
return sl.a[i];
}
需要注意的是,有的时候返回引用是不安全的的,比如返回一个临时对象的引用,比如如下:
ret是局部对象func结束,ret就销毁的了,返回他的别名本质也一种类似野指针的行为
cpp
int& func()
{
int ret = 0;
//...
return ret;
}
int& fxx()
{
int xxx = 1000;
//...
return xxx;
}