引用的本质
(1)本质
本质:引用的本质在c++内部实现是一个指针常量(引用是一个指针常量),指针常量指的是(int* const p = &a;
)指针的指向不可以更改,但指针指向的地址内部存放的值可以更改。
(2)示例代码
void func(int& ref){
ref = 100;
}
int main(){
int a = 10;
//c++内部自动转换为int* const ref = &a;
//这一点也说明引用不能更改(指针常量的指向不能更改)
int &ref = a;
ref = 20; //内部发现ref是引用,自动转换为*ref = 20;
cout << "a= " << a << endl; //结果是20
cout << "ref= " << ref << endl; //结果是20
fuc(a);
return 0;
}
(3)结论
c++推荐使用引用技术,因为语法方便,引用本质是指针常量,里边繁琐的指针操作编译器都帮我们做了。
常量引用
(1)作用:
常量引用主要用来修饰形参,防止误操作。
在函数列表中,可以加const修饰形参,防止形参改变实参。
(2)示例代码
int a = 10;
int &b = a; //正确
int &b = 10; //不正确,引用必须引一块合法的内存空间(堆区或栈区),而不是一个常量(全局区 常量区)
const int& ref = 10; //正确 加上const之后,编译器将代码修改为int temp = 10;const int& b = temp;
ref = 1000; //编译器报错,因为const不可修改
//打印数据函数
void showValue(int& val){
val = 1000;
cout << "val= " << val << endl;
}
int main(){
int a = 100;
showValue(a); //输出1000,showValue函数创建一个引用接收变量a,然后再函数内部修改了变量a的值,所以在a的值被改变。
cout << "val= " << val << endl; //输出也是1000
return 0;
}
上述代码中showValue作用仅为打印,修改main函数中value的值并非本意,因此可用修饰形参,防止出现上述在打印函数中修改参数值的误操作。修改后的代码如下:
//打印数据函数
void showValue(const int& val){
//val = 1000; 加了const之后,这里会报错
cout << "val= " << val << endl;
}
int main(){
int a = 100;
showValue(a);
cout << "val= " << val << endl;
return 0;
}