• 第十章 引用


    一、引用的基本使用

    作用: 给变量起别名

    语法: 数据类型 &别名 = 原名

    示例:

    1.  int main() {
    2.  ​
    3.   int a = 10;
    4.   int &b = a;
    5.  ​
    6.   cout << "a = " << a << endl;
    7.   cout << "b = " << b << endl;
    8.  ​
    9.   b = 100;
    10.  ​
    11.   cout << "a = " << a << endl;
    12.   cout << "b = " << b << endl;
    13.  ​
    14.   system("pause");
    15.  ​
    16.   return 0;
    17.  }

    二、引用注意事项

    • 引用必须初始化

    • 引用在初始化后,不可以改变

    示例:

    1.  int main() {
    2.  ​
    3.   int a = 10;
    4.   int b = 20;
    5.   //int &c; //错误,引用必须初始化
    6.   int &c = a; //一旦初始化后,就不可以更改
    7.   c = b; //这是赋值操作,不是更改引用
    8.  ​
    9.   cout << "a = " << a << endl;
    10.   cout << "b = " << b << endl;
    11.   cout << "c = " << c << endl;
    12.  ​
    13.   system("pause");
    14.  ​
    15.   return 0;
    16.  }

    三、引用做函数参数

    作用:函数传参时,可以利用引用的技术让形参修饰实参

    优点:可以简化指针修改实参

    示例:

    1.  //1. 值传递
    2.  void mySwap01(int a, int b) {
    3.   int temp = a;
    4.   a = b;
    5.   b = temp;
    6.  }
    7.  ​
    8.  //2. 地址传递
    9.  void mySwap02(int* a, int* b) {
    10.   int temp = *a;
    11.   *a = *b;
    12.   *b = temp;
    13.  }
    14.  ​
    15.  //3. 引用传递
    16.  void mySwap03(int& a, int& b) {
    17.   int temp = a;
    18.   a = b;
    19.   b = temp;
    20.  }
    21.  ​
    22.  int main() {
    23.  ​
    24.   int a = 10;
    25.   int b = 20;
    26.  ​
    27.   mySwap01(a, b);
    28.   cout << "a:" << a << " b:" << b << endl;
    29.  ​
    30.   mySwap02(&a, &b);
    31.   cout << "a:" << a << " b:" << b << endl;
    32.  ​
    33.   mySwap03(a, b);
    34.   cout << "a:" << a << " b:" << b << endl;
    35.  ​
    36.   system("pause");
    37.  ​
    38.   return 0;
    39.  }

    总结:通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单

    四、引用做函数返回值

    作用:引用是可以作为函数的返回值存在的

    注意:不要返回局部变量引用

    用法:函数调用作为左值

    示例:

    1.  //返回局部变量引用
    2.  int& test01() {
    3.   int a = 10; //局部变量
    4.   return a;
    5.  }
    6.  ​
    7.  //返回静态变量引用
    8.  int& test02() {
    9.   static int a = 20;
    10.   return a;
    11.  }
    12.  ​
    13.  int main() {
    14.  ​
    15.   //不能返回局部变量的引用
    16.   int& ref = test01();
    17.   cout << "ref = " << ref << endl;
    18.   cout << "ref = " << ref << endl;
    19.  ​
    20.   //如果函数做左值,那么必须返回引用
    21.   int& ref2 = test02();
    22.   cout << "ref2 = " << ref2 << endl;
    23.   cout << "ref2 = " << ref2 << endl;
    24.  ​
    25.   test02() = 1000;
    26.  ​
    27.   cout << "ref2 = " << ref2 << endl;
    28.   cout << "ref2 = " << ref2 << endl;
    29.  ​
    30.   system("pause");
    31.  ​
    32.   return 0;
    33.  }

    五、引用的本质

    本质:引用的本质在c++内部实现是一个指针常量.

    讲解示例:

    1.  //发现是引用,转换为 int* const ref = &a;
    2.  void func(int& ref){
    3.   ref = 100; // ref是引用,转换为*ref = 100
    4.  }
    5.  int main(){
    6.   int a = 10;
    7.      
    8.      //自动转换为 int* const ref = &a; 指针常量是指针指向不可改,也说明为什么引用不可更改
    9.   int& ref = a;
    10.   ref = 20; //内部发现ref是引用,自动帮我们转换为: *ref = 20;
    11.      
    12.   cout << "a:" << a << endl;
    13.   cout << "ref:" << ref << endl;
    14.      
    15.   func(a);
    16.   return 0;
    17.  }

    结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了

    六、常量引用

    作用:常量引用主要用来修饰形参,防止误操作

    在函数形参列表中,可以加const修饰形参,防止形参改变实参

    示例:

    1.  //引用使用的场景,通常用来修饰形参
    2.  void showValue(const int& v) {
    3.   //v += 10;
    4.   cout << v << endl;
    5.  }
    6.  ​
    7.  int main() {
    8.  ​
    9.   //int& ref = 10; 引用本身需要一个合法的内存空间,因此这行错误
    10.   //加入const就可以了,编译器优化代码,int temp = 10; const int& ref = temp;
    11.   const int& ref = 10;
    12.  ​
    13.   //ref = 100; //加入const后不可以修改变量
    14.   cout << ref << endl;
    15.  ​
    16.   //函数中利用常量引用防止误操作修改实参
    17.   int a = 10;
    18.   showValue(a);
    19.  ​
    20.   system("pause");
    21.  ​
    22.   return 0;
    23.  }

  • 相关阅读:
    【JavaSE】数据类型与变量
    ForkJoin详解
    【JDK 8-函数式编程】4.3 Consumer
    AI算法助力室内家具布局
    【数据结构】归并排序
    FCN的代码解读
    LeetCode Cookbook 数组习题(6)
    第二课第二周第1-5节-基于树的模型用于医学预后
    冠达管理:光脚阴线第二天一定下跌么?
    深度梯度下降森林模型在轴承故障诊断中的应用
  • 原文地址:https://blog.csdn.net/qq_26126363/article/details/133335335