引用
引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据。引用类似于 Windows 中的快捷方式,一个可执行程序可以有多个快捷方式,通过这些快捷方式和可执行程序本身都能够运行程序;引用还类似于人的绰号(笔名),使用绰号(笔名)和本名都能表示一个人。
语法格式:
type &name = data;
引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其它数据,这有点类似于常量(const 变量)。
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int &b = a;
cout<<a<<endl;
cout<<b<<endl;
cout<<&a<<endl;
cout<<&b<<endl;
/*将会报错,引用要从一而终,不能再引用其它数据
int c = 6;
int &b = c;
*/
return 0;
}
输出结果:
由于引用 r 和原始变量 a 都是指向同一地址,所以通过引用也可以修改原始变量中所存储的数据
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int &b = a;
cout<<a<<endl;
cout<<b<<endl;
b = 8;//更新a的值
cout<<"new_a: "<<a<<endl;
cout<<"new_b: "<<b<<endl;
cout<<&a<<endl;
cout<<&b<<endl;
return 0;
}
输出结果:
C++引用作为函数参数
在定义或声明函数时,我们可以将函数的形参指定为引用的形式,这样在调用函数时就会将实参和形参绑定在一起,让它们都指代同一份数据。如此一来,如果在函数体中修改了形参的数据,那么实参的数据也会被修改,从而拥有“在函数内部影响函数外部数据”的效果。
#include<iostream>
using namespace std;
void swap(int &a,int &b);
int main()
{
int a,b;
cout<<"please input two datas:"<<endl;
cin>>a>>b;
swap(a,b);
cout<<a<<" "<<b<<endl;
return 0;
}
void swap(int &a,int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
输出结果:
C++引用作为函数返回值
在将引用作为函数返回值时应该注意一个小问题,就是不能返回局部数据(例如局部变量、局部对象、局部数组等)的引用,因为当函数调用完成后局部数据就会被销毁,有可能在下次使用时数据就不存在了,C++ 编译器检测到该行为时也会给出警告。
#include <iostream>
using namespace std;
int &plus10(int &r) {
int m = r + 10;
return m; //返回局部数据的引用
}
int main() {
int num1 = 10;
int num2 = plus10(num1);
cout << num2 << endl;
int &num3 = plus10(num1);
int &num4 = plus10(num3);
cout << num3 << " " << num4 << endl;
return 0;
}
输出结果:
#include <iostream>
using namespace std;
int &plus10(int &r) {
r += 10;
return r; //返回局部数据的引用
}
int main() {
int num1 = 10;
int a = 100;
int num2 = plus10(num1);
cout << num2 << endl;
int num3 = plus10(a);
int num4 = plus10(num3);
int num5 = plus10(num4);
int num6 = plus10(num5);
cout << num3 << " " << num4<<" " <<num5 <<" " << num6<<endl;
return 0;
}
输出结果:
指针和引用的自增(++)自减(–)运算意义不一样
对指针使用 ++ 表示指向下一份数据,对引用使用 ++ 表示它所指代的数据本身加 1;自减(–)也是类似的道理
#include <iostream>
using namespace std;
int main (){
int a = 10;
int &r = a;
r++;
cout<<r<<endl;
int arr[2] = { 27, 84 };
int *p = arr;
p++;
cout<<*p<<endl;
return 0;
}
输出结果: