• C++引用的基本用法及拓展用法


    目录

    1.引用的基本概念释义

    2.引用的基本语法

    3.C++ 引用 vs 指针

    4.引用的输出内容?

    4.1直接输出引用的值

    ​编辑4.2更改引用的值(原始数据的变化?)

    4.3结论

    5.把引用作为参数?

    5.1函数中形参的改变可以传递给main中的实参么?

    5.2函数形参不用引用main中的实参会发生改变么?

    6.把引用作为返回值会返回什么?

    6.1用数组(通过函数改变数组第i个元素值输出)来验证引用作为返回值的作用

    6.2不用引用可以改变写在函数中的数组第i个元素值么?


    1.引用的基本概念释义

    引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。

    2.引用的基本语法

    数据类型 &别名 = 原名;

    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 型引用"

    3.C++ 引用 vs 指针

    引用很容易与指针混淆,它们之间有三个主要的不同:

    • 不存在空引用。引用必须连接到一块合法的内存
    • 一旦引用被初始化为一个对象;就不能被指向到另一个对象;指针可以在任何时候指向到另一个对象
    • 引用必须在创建时被初始化。指针可以在任何时间被初始化

    4.引用的输出内容?

    4.1直接输出引用的值

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. //引用的基本用法
    6. //引用的语法: 数据类型 &变量别名=变量原名
    7. int a = 10;//变量a原名是a,int类型,占四个字节
    8. //按照语法创建原变量a的别名
    9. int &b = a;
    10. //输出原名a,和别名b内容
    11. cout << "a=" << a << endl;
    12. cout << "b=" << b << endl;
    13. system("pause");
    14. return 0;
    15. }

    引用(别名)b的值和原名a一样

    4.2更改引用的值(原始数据的变化?)

    比如,我们把b别名b的值修改成30,再次执行输出,原名a也会改变么?

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. //引用的基本用法
    6. //引用的语法: 数据类型 &变量别名=变量原名
    7. int a = 10;//变量a原名是a,int类型,占四个字节
    8. //按照语法创建原变量a的别名
    9. int &b = a;
    10. //输出原名a,和别名b内容
    11. cout << "a=" << a << endl;
    12. cout << "b=" << b << endl;
    13. //修改别名b的值,原名a也会发生变化么?
    14. cout<<"修改别名b的值之后的输出:"<
    15. b = 30;//给a的别名b赋值为30
    16. cout << "a=" << a << endl;
    17. cout << "b=" << b << endl;
    18. system("pause");
    19. return 0;
    20. }

     从输出结果可以看出,修改别名的值,原名的值也同样被修改了

    4.3结论

    就好比我的书名(户口本上的大名)叫洛洛,我的小名(长辈起的乳名)叫小洛,那么有天小洛成了暴发户,突然有了很多RMB,那么洛洛是不是跟现在一样(穷?)那肯定不是啊,两个名字都指代我,无论是大名指代的我还是小名指代的我发生了任何变化,我这个人本身也会同步发生相应变化

    换到引用上也是一样的,给原始数据换一个别名,也指向那段内容,无论别名发生了任何变化,原名指代的内容也会发生相应变化,换过来也一样,原名的值发生了变化,别名也会发生变化

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. //引用的基本用法
    6. //引用的语法: 数据类型 &变量别名=变量原名
    7. int a = 10;//变量a原名是a,int类型,占四个字节
    8. //按照语法创建原变量a的别名
    9. int &b = a;
    10. //输出原名a,和别名b内容
    11. cout << "a=" << a << endl;
    12. cout << "b=" << b << endl;
    13. //修改别名b的值,原名a也会发生变化么?
    14. cout << "修改别名b的值之后的输出:" << endl;
    15. b = 30;//给a的别名b赋值为30
    16. cout << "a=" << a << endl;
    17. cout << "b=" << b << endl;
    18. cout << "修改原名a的值之后的输出:" << endl;
    19. a = 100;
    20. cout << "a=" << a << endl;
    21. cout << "b=" << b << endl;
    22. system("pause");
    23. return 0;
    24. }

    5.把引用作为参数?

    5.1函数中形参的改变可以传递给main中的实参么?

    C++ 支持把引用作为参数传给函数,这比传一般的参数更安全,可以实现同步修改

    可以从 C++ 函数中返回引用,就像返回其他数据类型一样

    写一个交换两个参数的值的函数swap

    1. //函数定义,把引用作为函数的形参
    2. void swap(int &a, int &b)
    3. {
    4. int temp = 0;//以防待会儿报错,先初始化整型变量temp
    5. temp = a;//保存地址a的值
    6. a = b;//把b值赋给a
    7. b = temp;//把a值赋给b
    8. //实现a,b值交换
    9. }

    在main函数主体中进行调用函数,c,d前后变化

    1. #include
    2. using namespace std;
    3. //函数定义,把引用作为函数的形参
    4. void swap(int &a, int &b)
    5. {
    6. int temp = 0;//以防待会儿报错,先初始化整型变量temp
    7. temp = a;//保存地址a的值
    8. a = b;//把b值赋给a
    9. b = temp;//把a值赋给b
    10. //实现a,b值交换
    11. }
    12. int main()
    13. {
    14. //局部变量c,d声明
    15. int c = 10;
    16. int d = 20;
    17. //调用swap函数进行交换前输出
    18. cout << "交换前c=" << c << endl;
    19. cout << "交换前d=" << d << endl;
    20. //调用函数swap进行交换后输出
    21. swap(c, d);
    22. cout << "交换后c=" << c << endl;
    23. cout << "交换后d=" << d << endl;
    24. system("pause");
    25. return 0;
    26. }

    在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还会发生变化么?

    1. #include
    2. using namespace std;
    3. //函数定义,把引用作为函数的形参
    4. void swap(int a, int b)
    5. {
    6. int temp = 0;//以防待会儿报错,先初始化整型变量temp
    7. temp = a;//保存地址a的值
    8. a = b;//把b值赋给a
    9. b = temp;//把a值赋给b
    10. //实现a,b值交换
    11. }
    12. int main()
    13. {
    14. //局部变量c,d声明
    15. int c = 10;
    16. int d = 20;
    17. //调用swap函数进行交换前输出
    18. cout << "交换前c=" << c << endl;
    19. cout << "交换前d=" << d << endl;
    20. //调用函数swap进行交换后输出
    21. swap(c, d);
    22. cout << "交换后c=" << c << endl;
    23. cout << "交换后d=" << d << endl;
    24. system("pause");
    25. return 0;
    26. }

    输出结果表明,未使用引用的形参的值交换命令并未在实参身上奏效

    所以,引用作为形参使用,会使函数调用后,形参发生同步变化(这也就是之前博文里提到的参数传递验证)

    6.把引用作为返回值会返回什么?

    可以从 C++ 函数中返回引用,就像返回其他数据类型一样,可同步改变到实参进行值传递

    6.1用数组(通过函数改变数组第i个元素值输出)来验证引用作为返回值的作用

    创建一个数组arr,写一个取址(此处&用于取址,取arr数组每个元素的地址,便于访问,若去掉,则报错)函数setArr,把数组arr中的每个元素的第i个引用值作为返回值,在main函数中输出,查看修改数组第i个位置的值后,是否会相应进行同步改变

    具体实现代码如下

    1. #include
    2. using namespace std;
    3. double arr[] = { 10.1,12.6,13.5,14.7,15.8,16.9 };//定义一个double类型数组arr并初始化
    4. double &setArr(int i)
    5. {
    6. double &ref = arr[i];
    7. return ref;//返回第i个元素的引用,ref是一个引用变量,ref 引用arr[i];
    8. }
    9. int main()
    10. {
    11. cout << "调用setArr函数前的值:" << endl;
    12. //懒得数,就直接用sizeof求数组个数
    13. int len = sizeof(arr) / sizeof(arr[0]);
    14. for (int i = 0; i < len; i++)
    15. {
    16. cout << "数组arr第[" << i << "]个元素为" << arr[i] << endl;
    17. }
    18. cout << "调用setArr函数后的值:" << endl;
    19. setArr(1) = 20.99;//改变数组arr第2个元素
    20. setArr(2) = 30.66;//改变数组arr第3个元素
    21. for (int i = 0; i < len; i++)
    22. {
    23. cout << "数组arr第[" << i << "]个元素为" << arr[i] << endl;
    24. }
    25. system("pause");
    26. return 0;
    27. }

    因为不想数int arr[]={...}的元素个数据,索性创建一个整型的len变量来接收sizeof关键字求出的数组元素个数

    输出结果如下,调用函数改变形参相应位置元素值,实参也会同步输出

    6.2不用引用可以改变写在函数中的数组第i个元素值么?

    double ref = arr[i];//去掉引用&,查看结果,setArr函数中

    return ref;//返回非引用的ref,查看在main函数中随着用函数修改第i个元素值,实参是否会同步变化输出

    具体代码如下

    1. #include
    2. using namespace std;
    3. double arr[] = { 10.1,12.6,13.5,14.7,15.8,16.9 };//定义一个double类型数组arr并初始化
    4. double &setArr(int i)//此处&用于取址,取arr数组每个元素的地址,便于访问,若去掉,则报错
    5. {
    6. double ref = arr[i];//去掉引用&,查看结果
    7. return ref;//返回第i个元素的引用,ref是一个引用变量,ref 引用arr[i];
    8. }
    9. int main()
    10. {
    11. cout << "调用setArr函数前的值:" << endl;
    12. //懒得数,就直接用sizeof求数组个数
    13. int len = sizeof(arr) / sizeof(arr[0]);
    14. for (int i = 0; i < len; i++)
    15. {
    16. cout << "数组arr第[" << i << "]个元素为" << arr[i] << endl;
    17. }
    18. cout << "调用setArr函数后的值:" << endl;
    19. setArr(1) = 20.99;//改变数组arr第2个元素
    20. setArr(2) = 30.66;//改变数组arr第3个元素
    21. for (int i = 0; i < len; i++)
    22. {
    23. cout << "数组arr第[" << i << "]个元素为" << arr[i] << endl;
    24. }
    25. system("pause");
    26. return 0;
    27. }

    输出结果表明,返回值不是引用,对应位置元素并不会随之改变

  • 相关阅读:
    Python传递参数的5种方式
    Excel 可视化教程之可视化的科学与艺术
    第二周 day03
    早期互联网发展对加密行业有什么启示
    NXP i.MX 8M Mini工业核心板B2B版本,4核ARM Cortex-A53@1.6GHz设计
    栈和队列及表达式求值问题
    【数据结构初阶】队列&&队列的面试题
    A-level 物理实验题目
    防火防盗防CDN流量盗刷
    防止SQL注入的四种方案
  • 原文地址:https://blog.csdn.net/qq_58619891/article/details/127660218