引用:
代码可以按照值的方式来实现,最终可以达到指针的效果
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int& ra = a;//取别名
ra = 100;
cout << a << endl;
return 0;
}
引用的特性
1.引用类型必须和引用实体是同种类型的
2.引用在定义时必须初始化,必须初始化引用
3.一个变量可以有多个引用
4.引用一旦引用一个实体,再不能引用其他实体
常引用:const
将const类型的引用称为const引用
const修饰a,表面a是一个常量,常量不允许被修改
const int a =10;
//int& ra =a; //这样会报错
const int& ra =a; //但是不能通过ra 修改 a
不想通过ra修改a,就用const类型的引用
int main()
{
double d=10.12;
//int& rd = d; //报错:原因类型不同
const int& rd = d; //会开辟一块新空间
d=31.41;
cout<<rd<<endl;
return 0;
}
结果 ra = 10
必须加const,编译器发现double和int之间可以发生隐式类型转换,于是重新创建了一块整型的空间,将d中整型部分放到临时空间中了。临时空间在栈上,用户不知道这个空间的名字和地址,所以就不能被修改。
引用的使用场景
1.为了简化代码给复杂的表达式取别名
2.用引用作为函数的形参
3.如果不想通过形参修改外部的实参,则形参可以设置为const类型的引用。
4.用引用作为函数的返回值
int& Add(int left ,int right)
{
int temp=left+right;
return temp;
}
int main()
{
int& ret=Add(1,2):
printf("%d\n",ret);
}
为什么后两次的值没有被修改?
后序函数调用时候 ,开辟的空间正好在上一次函数调用时的位置,新一次函数调用时,需要将上一个函数调用之后在空间中留下的垃圾数据清理掉,不能返回函数栈上的空间,即返回的实体没有随着函数的结束而销毁,如全局变量、static修饰的变量、堆空间等。