引用的本质
我们都知道引用就是其他变量的别名,比指针更加的可读和实用。那么引用的本质到底是什么呢?
编译器到底做了什么?
引用在单独定义时必须要声明,这一点很像常量;引用占的内存空间和指针一样;所以不难推测引用的本质其实就是常量指针。
Type& name 等价于 Type* const name
这也体现了C++在设计时为了实用性而做出的细节隐藏,让使用者只需把引用当成是变量的一个别名,具体的过程由编译器内部实现。
指针的引用
在c语言中获取被调用函数中一块内存中的资源要用二级指针,如下:
struct Car{
int id;
string name;
}
//形参为二级指针
int getCar(Car ** p){
Car* tmp=NULL;
tmp=(Car*)malloc(sizeof(Car));
tmp->id=1;
tmp->name="abc";
// *p为目标内存块的首地址
*p=tmp;
}
void main(){
Car* ptr=NULL:
//传入的是地址
getCar(&ptr);
}
这样看起来很繁琐,而C++中使用指针的引用可以让可读性更强。
struct Car{
int id;
string name;
}
//形参为引用类型(指针的引用)
int getCar(Car* &p){
p=(Car *)malloc(sizeof(Teacher));
if(p == NULL){
return -1;
}
p->age=1;
}
void main(){
Car* ptr=NULL:
//传入的是地址
getCar(&ptr);
}
常引用
常引用的作用是让变量 引用只读属性。常引用有以下两种情况
(1)用变量初始化
int x=1;
//用变量初始化常引用,这样就不能通过y去修改x
const int &y=x;
(2)用字面量初始化
//编译器会把x放到符号表中
const int x=1;
//如果用普通的引用,下面这句话编译会报错,因为字面量1是没有内存的地址的
int & y1=1;
//加上cosnt 就可以成功的编译;编译器会直接分配内存空间来存储1,然后让y2指向这个内存空间
const int & y2=1;