c++中新增类型-引用的本质
1.引用在c++的内部是实现一个指针常量
例如:int &a = c; 等同于 int *const a = &c;
注意:
(1)、引用占用空间大小与指针相同。
(2)、引用是变量的一个别名。
(3)、引用的特性:
①功能性:本质是指针
②安全性:可以避免由于指针操作不当带来的内存错误
③操作性:简单
2.特殊的const引用
例如:const int &a = var.
该引用使得变量有只读属性
int a = 4;
const int &b = a;
b = 5; //错误:b是一个只读变量
int *p = (int *)&b;
*p = 6; //正确,修改变量a的值
注意:使用常量对const 引用进行初始化时,c++编译器会为常量值分配空间
,并将引用名作为这段空间的别名
const int &b = 1; //用常量对const引用进行初始化
int *p = (int *)&b;
b = 5; //错误, b是只读变量
*p = 5; //正确,修改变量a的值
结论:常量对const引用初始化后将变成一个只读变量
实例剖析:
#include <stdio.h>
int &demo() //int *const
{
int d = 0;
printf("demo: d = %d\n", d);
return d; //注意这里返回了一个局部变量的地址,在函数调用完成后该变量所占的内存空间被销毁,所以返回了一个可能不存在的地址,出错
}
int &func()
{
static int s = 0;
printf("func: s = %d\n", s);
return s; //静态变量在全局静态存储区存储,该函数返回了静态变量的地址,正确
}
int main(int argc, char const *argv[])
{
int &rd = demo();
int &rs = func();
printf("\n");
printf("main: rd = %d\n", rd);
printf("main: rs = %d\n", rs);
rd = 10;
rs = 11;
printf("\n");
printf("main: rd = %d\n", rd);
printf("main: rs = %d\n", rs);
return 0;
}
编译结果:
可以看出现在有的编译器会出现编译警告,但是运行直接崩溃。所以要仔细使用const引用,本质就是指针错误,而且必须消除编译产生的每一个警告信息,避免出错。