一、引用的概念
引用不是定义一个变量,而是给一个已有成员起一个别名
类型 &引用变量名 = 以定义的变量名
int a = 10;
int &b = a;
引用 的特点
1.一个变量可以有多个成员
2.引用必须初始化
3.引用只能在初始化的时候引用一次,不能改变在引用其他的变量
二、const 引用
1.const引用 可以为 非const变量 的别名
非const变量相当于可以对他进行读、写操作
而const引用,只能对他进行读,不能进行写操作
权限 读写->只读(权限可以缩小)
int a = 4;
const int& b = a;
cout << a << endl; //4
cout << b << endl; //4
变量的值被改变时,引用的值同时也会改变,但是不能直接改变引用的值
a = 5;
cout << a << endl; //5
cout << b << endl; //5
//b = 6; //不能对引用进行赋值
2. const变量只能用const引用,不能使用非const引用
const变量相当于只有读的权限,没有写的权限
非const引用既有读,又有写的权限
权限 :读->读写(不可以)
权限只能放大,不能缩小
const int c = 1;
const int& d = c;
//int& d1 = c;
const int & d2 = 5;//常量具有常性,只有常引用可以引用常量
3.不同类型变量引用要用const
double a = 1.1;
//int &b = a;
const int& b1 = a;
a是double类型的,它要赋值给int类型会发生隐式类型转换
用a赋值给b时,会生成一个临时变量,即b引用的时这个带有常性的临时变量,所以要用const
三、引用做参数
1.值传递
void Swap1(int left, int right)
{
int temp = left;
left = right;
right = temp;
}
int main()
{
int a = 10;
int b = 20;
cout << "a:" << a << endl;
cout << "b:" << b << endl;
Swap1(a, b);
cout << "a:" << a << endl;
cout << "b:" << b << endl;
system("pause");
return 0;
}
值传递不能改变a,b的值
2.引用传递
void Swap2(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
int main()
{
int a = 10;
int b = 20;
cout << "a:" << a << endl;
cout << "b:" << b << endl;
Swap2(a, b);
cout << "a:" << a << endl;
cout << "b:" << b << endl;
system("pause");
return 0;
}
3.指针传递
void Swap3(int* left, int* right)
{
int temp = *left;
*left = *right;
*right = temp;
}
int main()
{
int a = 10;
int b = 20;
cout << "a:" << a << endl;
cout << "b:" << b << endl;
Swap3(&a, &b);
cout << "a:" << a << endl;
cout << "b:" << b << endl;
system("pause");
return 0;
}
引用传递和值传递
引用传递效率更高,值传递会有对象变量的拷贝,生成局部变量;
而引用是参数的一个别名,本身不占内存,所以开销小。
四、引用做返回值
1、正常的值返回
int Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int a = 10;
int b = 20;
int ret = Add(a, b);
//int& ret = Add(a, b); //不能用非const的引用,因为Add函数返回的c是一个临时变量
const int& ret = Add(a, b);
cout << ret;
system("pause");
return 0;
}
Add函数为值返回,它返回的是c的一个具有常性的临时变量,c出了作用域以后会销毁,所以要在前面加const;
2.引用做返回值
int& Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int a = 10;
int b = 20;
int& ret = Add(a, b);
cout << ret;
system("pause");
return 0;
}
注:尽量不要返回临时变量的引用,如果不是临时变量,则可以用引用返回
因为临时变量出了作用域以后就会销毁,临时变量的引用相当于它的别名,变量销毁了以后,引用就会指向不确定的内存