作用:

  • 给变量起别名

    语法:

  • 数据类型 &别名 = 原名,别名的数据类型和原名的数据类型一致

引用注意事项

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

    示例:

  1. #include <iostream>
  2. using namespace std;
  3. int main(void) {
  4. int a = 10;
  5. //1.引用必须初始化
  6. // int &d; // 错误,必须要初始化
  7. //2.引用在初始化后,不可以改变
  8. int &b = a;
  9. int c = 20;
  10. b = c; // 赋值操作,而不是更改引用,a的值也会变成20
  11. cout << "a = " << a << endl;
  12. cout << "b = " << b << endl;
  13. cout << "c = " << c << endl;
  14. system("pause");
  15. return 0;
  16. }

引用做函数参数

  • 作用:函数传参时,可以利用引用的技术让形参修饰实参
  • 优点:可以简化指针修改实参
  1. #include <iostream>
  2. using namespace std;
  3. // 交换函数
  4. //1.值传递
  5. void mySwap01(int a, int b) {
  6. int temp = a;
  7. a = b;
  8. b = temp;
  9. }
  10. //2.地址传递
  11. void mySwap02(int* a, int* b) {
  12. int temp = *a;
  13. *a = *b;
  14. *b = temp;
  15. }
  16. //3.引用传递
  17. void mySwap03(int &a, int &b) {
  18. int temp = a;
  19. a = b;
  20. b = temp;
  21. }
  22. int main(void) {
  23. int a = 10;
  24. int b = 20;
  25. //mySwap01(a, b); // 值传递,形参不会修饰实参
  26. //mySwap02(&a, &b); //地址传递,形参会修饰实参
  27. mySwap03(a, b); // 引用传递,形参会修饰实参
  28. cout << "a = " << a << endl;
  29. cout << "b = " << b << endl;
  30. system("pause");
  31. return 0;
  32. }

总结:

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

引用做函数返回值

作用:

  1. - 引用是可以作为函数的返回值存在的。

注意:

  1. - 不要返回局部变量引用

用法:

  1. - 函数调用作为左值
  1. #include <iostream>
  2. using namespace std;
  3. // 引用做函数的返回值
  4. //1.不要返回局部变量的引用
  5. int& test1() {
  6. int a = 10; // 局部变量存放在内存四区中的 栈区
  7. return a;
  8. }
  9. //2.函数地调用可以作为左值
  10. int& test2() {
  11. static int a = 10; // 静态变量,存放在全局区中,全局区上的数据在程序结束后由系统释放
  12. return a;
  13. }
  14. int main(void) {
  15. // int& ref = test1();
  16. // cout << "ref = " << ref << endl; // 在vs2019中,第一次结果正确,是因为编译器做了保留
  17. // cout << "ref = " << ref << endl; // 第二次结果错误,是因为a的内存已经释放
  18. int &ref2 = test2();
  19. cout << "ref2 = " << ref2 << endl;
  20. cout << "ref2 = " << ref2 << endl;
  21. test2() = 1000; // 如果函数的返回值是引用,这个函数调用可以作为左值
  22. cout << "ref2 = " << ref2 << endl;
  23. cout << "ref2 = " << ref2 << endl;
  24. system("pause");
  25. return 0;
  26. }

引用的本质

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

讲解示例:

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

总结:

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

常量引用

作用:

  1. - 常量引用主要用来修饰形参,防止误操作
  2. - 在函数形参列表中,可以加const修饰形参,防止形参改变实参
  1. #include <iostream>
  2. using namespace std;
  3. // 打印数据函数
  4. void showValue(const int& val) {
  5. //val = 1000;
  6. cout << "val = " << val << endl;
  7. }
  8. int main(void) {
  9. // 常量引用
  10. // 使用场景:用来修饰形参,防止误操作
  11. // int a = 10;
  12. // 加上const之后,编译器将代码修改为 int temp = 10; const int& ref = temp;
  13. // const int& ref = 10; // 引用必须引一块合法的内存空间
  14. //ref = 20; // 加入const之后变为只读,不可以修改
  15. int a = 100;
  16. showValue(a);
  17. cout << "a = " << a << endl;
  18. system("pause");
  19. return 0;
  20. }