引用

1. 概念

助记,”小明是二狗子,二狗子是小明”

  • 引用是一种类型
  • 引用型变量定义时必须用同一个目标变量初始化
  • 引用型变量就是目标变量的本身,可以看成时目标变量的别名,和目标变量是同一块内存
  • 对引用型变量的操作就是对目标变量本身的操作
  • 示例: ```cpp

    include

    using namespace std;

int main(int argc, char const *argv[]) { int val = 100; int& rval = val;

  1. cout << "val= " << val << endl;
  2. cout << "rval= " << rval << endl;
  3. val++;
  4. cout << "val= " << val << endl;
  5. cout << "rval= " << rval << endl;
  6. rval++;
  7. cout << "val= " << val << endl;
  8. cout << "rval= " << rval << endl;
  9. return 0;

}

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2902589/1634807432600-abba83bd-c2ac-42f0-921f-73b4ad2c982f.png#clientId=u0a5b504d-8a0e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=126&id=u8237bc35&margin=%5Bobject%20Object%5D&name=image.png&originHeight=126&originWidth=325&originalType=binary&ratio=1&rotation=0&showTitle=false&size=4009&status=done&style=none&taskId=udc35ddf8-3fb9-4742-a973-f1c823d27ed&title=&width=325)
  2. <a name="nioEH"></a>
  3. # 2. 引用,做函数形参类型
  4. - 形参就是实参的引用,形参和实参是同一块内存
  5. - 修改形参就是修改实参
  6. - 可以避免传参时的复制
  7. - 示例:
  8. ```cpp
  9. #include <iostream>
  10. using namespace std;
  11. void swap(int* a, int* b) {
  12. int temp = *a;
  13. *a = *b;
  14. *b = temp;
  15. }
  16. void swap2(int& a, int& b) {
  17. int temp = a;
  18. a = b;
  19. b = temp;
  20. }
  21. int main() {
  22. int a = 1;
  23. int b = 2;
  24. swap(&a, &b);
  25. cout << "a = " << a << endl;
  26. cout << "b = " << b << endl;
  27. int e = 5;
  28. int f = 6;
  29. swap2(e, f);
  30. cout << "e = " << e << endl;
  31. cout << "f = " << f << endl;
  32. return 0;
  33. }

3. 引用,做函数返回值类型

  • 函数返回的值,return后面的值是一块内存
  • 返回引用的函数可以做左值
  • 返回引用可以减少内存复制
  • 注意事项:
    • 从函数返回一个引用,必须要确保引用的内存,在函数返回后依然存在
    • 可以返回静态局部变量的引用,实参的引用
    • 不应该返回局部变量的引用和形参的引用
  • 示例: ```cpp

    include

    using namespace std;

int& getStaticVarRef() { static int a = 1; cout << “a = “ << a << endl; return a; }

int& getActualArgumentRef(int& a) { a++; return a; }

int& getLocalVarRef() { int c = 1; cout << “c = “ << c << endl; return c; }

int main() { getStaticVarRef(); getStaticVarRef()++; getStaticVarRef();

  1. int b = 1;
  2. getActualArgumentRef(b)++;
  3. cout << "b = " << b << endl;
  4. getLocalVarRef();
  5. getLocalVarRef()++;
  6. getLocalVarRef();
  7. return 0;

}

  1. <a name="ltI2I"></a>
  2. # 4. 引用的本质是指针类型常量
  3. - 示例:
  4. ```cpp
  5. #include <iostream>
  6. using namespace std;
  7. int main() {
  8. int n = 666;
  9. int* const p = &n;
  10. *p = 777;
  11. cout << "n = " << n << endl;
  12. cout << "*p " << *p << endl;
  13. n = 888;
  14. cout << "n = " << n << endl;
  15. cout << "*p " << *p << endl;
  16. int& rn = n;
  17. rn++;
  18. cout << "n = " << n << endl;
  19. cout << "*p " << *p << endl;
  20. return 0;
  21. }

5. 总结

  • 能使用引用的地方都可以使用指针完成,但是引用起来更方便,所以能使用引用的地方尽量使用引用