目录
6.1用数组(通过函数改变数组第i个元素值输出)来验证引用作为返回值的作用
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
数据类型 &别名 = 原名;
int a=10;//原始变量a的原名是a
int &b=a;//引用a的变量b的别名是b
试想变量名称是变量附属在内存位置中的标签,您可以把引用当成是变量附属在内存位置中的第二个标签。因此,您可以通过原始变量名称或引用来访问变量的内容
int a=10;
int &b=a;
double &c=d
在这些声明中,& 读作引用。因此,第一个声明可以读作 "b 是一个初始化为a 的整型引用",第二个声明可以读作 "c 是一个初始化为 d 的 double 型引用"
引用很容易与指针混淆,它们之间有三个主要的不同:
- #include
- using namespace std;
-
- int main()
- {
- //引用的基本用法
- //引用的语法: 数据类型 &变量别名=变量原名
- int a = 10;//变量a原名是a,int类型,占四个字节
- //按照语法创建原变量a的别名
- int &b = a;
- //输出原名a,和别名b内容
- cout << "a=" << a << endl;
- cout << "b=" << b << endl;
- system("pause");
- return 0;
- }
引用(别名)b的值和原名a一样
4.2更改引用的值(原始数据的变化?)比如,我们把b别名b的值修改成30,再次执行输出,原名a也会改变么?
- #include
- using namespace std;
-
- int main()
- {
- //引用的基本用法
- //引用的语法: 数据类型 &变量别名=变量原名
- int a = 10;//变量a原名是a,int类型,占四个字节
- //按照语法创建原变量a的别名
- int &b = a;
- //输出原名a,和别名b内容
- cout << "a=" << a << endl;
- cout << "b=" << b << endl;
- //修改别名b的值,原名a也会发生变化么?
- cout<<"修改别名b的值之后的输出:"<
- b = 30;//给a的别名b赋值为30
- cout << "a=" << a << endl;
- cout << "b=" << b << endl;
- system("pause");
- return 0;
- }
从输出结果可以看出,修改别名的值,原名的值也同样被修改了

4.3结论
就好比我的书名(户口本上的大名)叫洛洛,我的小名(长辈起的乳名)叫小洛,那么有天小洛成了暴发户,突然有了很多RMB,那么洛洛是不是跟现在一样(穷?)那肯定不是啊,两个名字都指代我,无论是大名指代的我还是小名指代的我发生了任何变化,我这个人本身也会同步发生相应变化
换到引用上也是一样的,给原始数据换一个别名,也指向那段内容,无论别名发生了任何变化,原名指代的内容也会发生相应变化,换过来也一样,原名的值发生了变化,别名也会发生变化
- #include
- using namespace std;
-
- int main()
- {
- //引用的基本用法
- //引用的语法: 数据类型 &变量别名=变量原名
- int a = 10;//变量a原名是a,int类型,占四个字节
- //按照语法创建原变量a的别名
- int &b = a;
- //输出原名a,和别名b内容
- cout << "a=" << a << endl;
- cout << "b=" << b << endl;
- //修改别名b的值,原名a也会发生变化么?
- cout << "修改别名b的值之后的输出:" << endl;
- b = 30;//给a的别名b赋值为30
- cout << "a=" << a << endl;
- cout << "b=" << b << endl;
- cout << "修改原名a的值之后的输出:" << endl;
- a = 100;
- cout << "a=" << a << endl;
- cout << "b=" << b << endl;
- system("pause");
- return 0;
- }

5.把引用作为参数?
5.1函数中形参的改变可以传递给main中的实参么?
C++ 支持把引用作为参数传给函数,这比传一般的参数更安全,可以实现同步修改
可以从 C++ 函数中返回引用,就像返回其他数据类型一样
写一个交换两个参数的值的函数swap
- //函数定义,把引用作为函数的形参
- void swap(int &a, int &b)
- {
- int temp = 0;//以防待会儿报错,先初始化整型变量temp
- temp = a;//保存地址a的值
- a = b;//把b值赋给a
- b = temp;//把a值赋给b
- //实现a,b值交换
- }
在main函数主体中进行调用函数,c,d前后变化
- #include
- using namespace std;
-
- //函数定义,把引用作为函数的形参
- void swap(int &a, int &b)
- {
- int temp = 0;//以防待会儿报错,先初始化整型变量temp
- temp = a;//保存地址a的值
- a = b;//把b值赋给a
- b = temp;//把a值赋给b
- //实现a,b值交换
- }
-
- int main()
- {
- //局部变量c,d声明
- int c = 10;
- int d = 20;
- //调用swap函数进行交换前输出
- cout << "交换前c=" << c << endl;
- cout << "交换前d=" << d << endl;
- //调用函数swap进行交换后输出
- swap(c, d);
- cout << "交换后c=" << c << endl;
- cout << "交换后d=" << d << endl;
- system("pause");
- return 0;
- }
在main函数中的c,d是实参,在swap自己写的函数中的a,b是形参,调用前,c=10,b=20实参未发生任何变化,调用后c,d两个实参跟着a,b两个形参一样,发生了数值交换
所以,引用作为函数中的形参进行传递时,我们在main函数中调用 swap(c,d)时,已经默认了形参int &a=c,int &b=d
所以函数两个形参a,b的值变化才会真真切切地同步给实参c,d

5.2函数形参不用引用main中的实参会发生改变么?
把函数swap形参写为普通整型参数int a,int b,不使用引用&,结果如何?实参c,d还会发生变化么?
- #include
- using namespace std;
-
- //函数定义,把引用作为函数的形参
- void swap(int a, int b)
- {
- int temp = 0;//以防待会儿报错,先初始化整型变量temp
- temp = a;//保存地址a的值
- a = b;//把b值赋给a
- b = temp;//把a值赋给b
- //实现a,b值交换
- }
-
- int main()
- {
- //局部变量c,d声明
- int c = 10;
- int d = 20;
- //调用swap函数进行交换前输出
- cout << "交换前c=" << c << endl;
- cout << "交换前d=" << d << endl;
- //调用函数swap进行交换后输出
- swap(c, d);
- cout << "交换后c=" << c << endl;
- cout << "交换后d=" << d << endl;
- system("pause");
- return 0;
- }
输出结果表明,未使用引用的形参的值交换命令并未在实参身上奏效

所以,引用作为形参使用,会使函数调用后,形参发生同步变化(这也就是之前博文里提到的参数传递验证)
6.把引用作为返回值会返回什么?
可以从 C++ 函数中返回引用,就像返回其他数据类型一样,可同步改变到实参进行值传递
6.1用数组(通过函数改变数组第i个元素值输出)来验证引用作为返回值的作用
创建一个数组arr,写一个取址(此处&用于取址,取arr数组每个元素的地址,便于访问,若去掉,则报错)函数setArr,把数组arr中的每个元素的第i个引用值作为返回值,在main函数中输出,查看修改数组第i个位置的值后,是否会相应进行同步改变
具体实现代码如下
- #include
- using namespace std;
- double arr[] = { 10.1,12.6,13.5,14.7,15.8,16.9 };//定义一个double类型数组arr并初始化
- double &setArr(int i)
- {
- double &ref = arr[i];
- return ref;//返回第i个元素的引用,ref是一个引用变量,ref 引用arr[i];
- }
- int main()
- {
- cout << "调用setArr函数前的值:" << endl;
- //懒得数,就直接用sizeof求数组个数
- int len = sizeof(arr) / sizeof(arr[0]);
- for (int i = 0; i < len; i++)
- {
- cout << "数组arr第[" << i << "]个元素为" << arr[i] << endl;
- }
-
- cout << "调用setArr函数后的值:" << endl;
- setArr(1) = 20.99;//改变数组arr第2个元素
- setArr(2) = 30.66;//改变数组arr第3个元素
- for (int i = 0; i < len; i++)
- {
- cout << "数组arr第[" << i << "]个元素为" << arr[i] << endl;
- }
- system("pause");
- return 0;
- }
因为不想数int arr[]={...}的元素个数据,索性创建一个整型的len变量来接收sizeof关键字求出的数组元素个数
输出结果如下,调用函数改变形参相应位置元素值,实参也会同步输出

6.2不用引用可以改变写在函数中的数组第i个元素值么?
double ref = arr[i];//去掉引用&,查看结果,setArr函数中
return ref;//返回非引用的ref,查看在main函数中随着用函数修改第i个元素值,实参是否会同步变化输出
具体代码如下
- #include
- using namespace std;
- double arr[] = { 10.1,12.6,13.5,14.7,15.8,16.9 };//定义一个double类型数组arr并初始化
- double &setArr(int i)//此处&用于取址,取arr数组每个元素的地址,便于访问,若去掉,则报错
- {
- double ref = arr[i];//去掉引用&,查看结果
- return ref;//返回第i个元素的引用,ref是一个引用变量,ref 引用arr[i];
- }
- int main()
- {
- cout << "调用setArr函数前的值:" << endl;
- //懒得数,就直接用sizeof求数组个数
- int len = sizeof(arr) / sizeof(arr[0]);
- for (int i = 0; i < len; i++)
- {
- cout << "数组arr第[" << i << "]个元素为" << arr[i] << endl;
- }
-
- cout << "调用setArr函数后的值:" << endl;
- setArr(1) = 20.99;//改变数组arr第2个元素
- setArr(2) = 30.66;//改变数组arr第3个元素
- for (int i = 0; i < len; i++)
- {
- cout << "数组arr第[" << i << "]个元素为" << arr[i] << endl;
- }
- system("pause");
- return 0;
- }
输出结果表明,返回值不是引用,对应位置元素并不会随之改变
