引用的本质
引用的本质是常指针
C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占的空间大小与指针相同。
由编译器内部实现,用户不可见
ref = 100l; //ref是引用 ---> *ref=100;
int a=10;
int& aRef = a; //自动转化为 int* const aRef = &a; 因为指针常量必须要初始化,所以引用也必须初始化,而且引用的对象也无法更改
aRef = 20l //内部发现aRef是引用,自动转化为: *aRef = 20;
指针的引用
一级指针的引用可以代替二级指针
如果你想把一个指针传入函数让其帮助初始化指针所指向一个对象或结构体,那么传二级指针和传指针的引用都是非常不错的方式
#include <iostream>
using namespace std;
typedef struct {
int age;
}Person, *pPerson;
void allocateMemFailure(pPerson p)
{
p = (pPerson)malloc(sizeof(Person));
p->age = 10000;
}
void allocateMemByPot(pPerson* p)
{
*p = (pPerson)malloc(sizeof(Person));
(*p)->age = 1000;
}
void allocateMemByRef(pPerson& p)
{
p = (pPerson)malloc(sizeof(Person));
p->age = 100;
}
void test(void)
{
Person* p = NULL;
Person* p1 = NULL;
Person* p2 = NULL;
allocateMemByRef(p);
allocateMemByPot(&p1);
allocateMemFailure(p2);
cout << p->age << endl;
cout << p1->age << endl;
cout << p2->age << endl;
}
int main()
{
test();
return 0;
}
常量引用
编译器为常量引用提供可能
int &ref = 10; //引用不合法的内存,不可以
const in &ref =10; //加入const后,编译器处理方式为:int temp=10; const int &ref = temp;
//此时ref引用的对象无法直接修改
//但是 治安要是合法的内存都可以使用指针间接修改
加const就是告诉别人不要去动他
加const用来修饰形参,让编译器去检查是否函数内非法更改了传入的对象