红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【C++】引用

引用

语法

本质:引用在内部的实现是一个指针常量(指针指向不可修改,但指针指向的值可修改)

作用:即给变量起别名,即两者操作同一块内存

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

注意:

  • 引用必须初始化
  • 引用在初始化后不可改变
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
int main(){
  int a = 10;
  int &b = a; // b 是 a 的引用
  cout << "a: " << a << endl; 
  cout << "b: " << b << endl;
  b = 20; // 修改 b 的值, a 的值也会改变
  cout << "a: " << a << endl;
  cout << "b: " << b << endl;
  return 0;
}

引用作为函数参数

作用:函数传参时可以让形参修饰实参

优点:简化指针修改实参

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
void Swap(int &a, int &b){ // 使用形参修饰实参
  int temp = a;
  a = b;
  b = temp;
}
int main(){
  int a = 10;
  int b = 20;
  Swap(a, b);
  cout << "a: " << a << endl;
  cout << "b: " << b << endl;
  return 0;
}

引用作为函数返回值

作用:

  • 引用可以作为函数的返回值存在
  • 函数的调用可以作为左值

不要返回局部变量引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
// 函数返回引用
// 注意:返回局部变量的引用是危险的,因为局部变量在函数结束后会被销毁
int& test(){
  static int a = 10; //静态变量,存在全局区
  return a; // 返回局部变量的引用
}
int main(){
  int &ref = test();
  cout << "ref: " << ref << endl; // 输出 10
  test() = 20; // 返回引用的函数的调用可以作为左值, 相当于直接对a赋值
  cout << "ref: " << ref << endl; // 输出 20
  return 0;
}

## 常量引用

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
void print(const int &val){
  // 由于此处是引用,在函数内部对val进行修改,外部的b也会改变
  // 形参前加const后,val变成了一个常量引用,内部val就不允许修改了
  // val = 1000; 
  cout << val;

}
int main(){
  int a = 10;
  // 常量引用,相当于编译器自动创建了一个临时空间,并将ref指向该空间
  // 此时不许修改
  const int& ref = 10; 
  
  // 实际应用
  int b = 100;
  print(b);
}