引用:给变量起一个别名
语法: 数据类型 &别名=原名
int main()
{
int a=10;
itn b=20;
int &b; //这是错误的。
int &c=a; //引用必须初始化,初始化完毕就不可以改变了
c=b;
cout << "a="<<a <<endl;
cout << "b="<<b<<endl;
cout << "c="<<c <<endl;
system("pause");
return 0;
}
引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:** 可以简化指针修饰实参**
//值传递
void myswap01(int a, int b){
int temp=a;
a=b;
b=temp;
}
//地址传递
void myswap02(int* a,int* b){ //定义Int 类型指针变量a
int temp =*a;
*a=*b;
*b=temp;
}
//引用传递
void myswap03(int &a, int &b)
{
int temp=a;
a=b;
b=temp;
}
引用做返回值
- 不要返回局部变量的引用
案例:
int& test01() //以引用的方式进行返回
{
int a=10;//局部变量存放在四区中的栈区
return a;
}
int main(){
int &ref = test01();
cout << "ref=" <<ref<<endl; //第一次结果正确,因为编译器做了保留
cout << "ref=" <<ref<<endl;//第二次结果错误,因为A的内存已经释放
}
注意:局部变量使用完,是释放的。所以这样的做是有隐患的。
改动:使用静态变量
int& test02(){
static int a=10; //静态变量,存放在全局区,全局区上的数据在程序结束后系统释放
return a;
}
int main(){
int& ref2=test02(); //与测试test01一样
cout <<"ref2="<<ref2<<endl;
}
//函数调用可以作为左值
test02()=1900; //test02()返回的是a的引用
cout <<"ref2="<<ref2<<endl;
============
引用的本质
内部的实现就是指针常量
即指针的指向是不可以修改的,指向的内容是可以修改的。
void func(int& ref){
ref =100; //ref 是引用,转换为 *ref =100
}
int main(){
int a=10;
int& ref=a;
ref =20;
cout<<"a:"<<a <<ebdl;
cout<<"ref:"<<ref <<endl;
func();
trnturn 0;
}
在C++中,推荐使用引用,把引用看成起别名即可。
常量引用:
作用:常量引用主要来修饰形参,防止误操作
在函数形参列表中,可以加const修饰形参
void showvalue(const int& v){ //这样形参就改不了外界的实参了
cout << v<<endl;
}
int main(){
int a=10;
//加上const之后 编译器将代码修改为: int temp=10;const int& ref =temp;
//const int& ref =10;//引用必须引一块合法的内存空间
//ref =20; // 加入const 之后变为只读,不可以修改
//函数中常利用常量引用防止误操作来修改实参
int a=10;
showvalue(a);
system("pause");
renturn 0;
}