1. 引用的基本使用
-
作用:给变量起别名
-
语法:数据类型 &别名=原名
-
注意:
-
别名数据类型与原名数据类型一致。
-
引用必须初始化。
-
引用一旦初始化后,就不可以更改(只能作为一个变量的别名)
-
一个变量可取多个别名,即可定义多个引用变量作同一个变量的别名
-
int a =10;
int &b=a; //int &b;代码是错误的必须初始化
//引用在初始化后,不可以改变
int c= 20;
b=c; //赋值操作,而不是更改引用。
2. 引用做函数参数
-
作用:函数传参时,可以利用引用的技术让形参修饰实参
-
优点:可以简化指针修改参数
#include <iostream>
using namespace std;
//交换函数
//1. 值传递:形参不会修饰实参
void swap1 (int a,int b)
{
int temp = a;
a=b;
b=temp;
cout << "swap1 a =" << a <<endl;
cout << "swap1 b =" << b <<endl;
}
//2. 地址传递:形参会修饰实参
void swap2(int *a,int *b)
{
int temp = *a;
*a=*b;
*b=temp;
}
//3. 引用传递:形参也修饰实参
void swap3(int &a,int &b) //&a相当于下面a的别名
{
int temp = a;
a=b;
b=temp;
cout << "swap1 a =" << a <<endl;
cout << "swap1 b =" << b <<endl;
}
int main()
{
int a=10;
int b=20;
swap1(a,b); //值传递调用
cout << " a =" << a <<endl;
cout << " b =" << b <<endl;
swap2(&a,&b); //地址传递
cout << " a =" << a <<endl;
cout << " b =" << b <<endl;
swap3(a,b); //引用传递
cout << " a =" << a <<endl;
cout << " b =" << b <<endl;
system("pause");
return 0;
}
通过引用参数产生的效果同按地址传递是一样的。
3. 引用做函数返回值
-
作用:引用是可以作为函数的返回值存在的
-
注意:不要返回局部变量引用
-
用法:如果函数的返回值是引用,函数调用可以作为左值
-
作为函数返回值格式如下:
-
返回类型& 函数名(形参列表及类型说明){函数体}
-
#include <iostream>
using namespace std;
//1. 不要返回局部变量引用
int& test1()
{
int a=10;
return a;
}
//2. 函数调用可以作为左值
int& test2()
{
static int a=10; //静态变量,存放在全局区,程序结束后系统自动释放
return a;
}
int main()
{
int &ref1 = test1();
cout <<"ref =" <<ref <<endl; //第一次结果正确,是因为编译器做了保留
cout <<"ref =" <<ref <<endl; //第二次结果错误,是因为a的内存释放
int &ref2 = test2();
cout << "ref2 =" <<ref2 <<endl;
test2()=1000; //如果函数的返回值是引用,函数调用可以作为左值
cout << "ref2 =" <<ref2 <<endl;
system("pause");
return 0;
}
4. 引用的本质
本质:引用的本质在c++内部实现是一个指针常量(请区别与常量指针)
ps:指针常量:指向不可改变,值可以改变;常量指针:指向可以改变,值不可以改变;
5. 常量引用
-
作用:常量引用主要用来修饰形参,防止误操作
-
在函数形参列表中,可以加 const 修饰形参,防止形参改变实参
int a = 10;
//加上const之后,编译器将代码修改 int temp=10;const int &ref =temp;
const int &ref =10;
//引用必须引一块合法的内存空间,int &ref=10;是错误的。
//加入const之后变为只读,不可修改