跳转至

C++ 引用

  • 作用: 给变量起别名
  • 语法: 数据类型 &别名 = 原名

[示例]

#include <iostream>
using namespace std;

int main() {
    int a = 10;
    int &b = a;

    cout << a << endl;
    cout << b << endl;

    system("pause");
    return 0;
}

使用引用的注意事项

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

引用作函数参数

  • 作用: 函数传参的时候,可以利用引用让形参修饰实参。
  • 优点: 简化指针修改实参。

通常,函数传入参数有两种方法:

//  值传递
void swap_a (int a, int b){
    a ^= b;
    b ^= a;
    a ^= b;
}

// 地址传递
void swap_b (int *a, int *b){
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}

其中值传递传入的形参不能更改实参,调用代码后实际传入的数值也不会有改变。

而引用传递如下:

1
2
3
4
5
6
// 引用传递
void swap_c (int &a, int&b){
    a ^= b;
    b ^= a;
    a ^= b;
}

引用作函数返回值

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

  • 函数的调用可以作为左值存在。

[示例]

#include <iostream>
using namespace std;

// 函数调用可以作为左值
int& test(){
    // 静态变量,存储在全局区
    static int a = 10;
    return a;
}

int main() {

    int &ref = test();

    cout << "ref = " << ref << endl;

    // 函数的返回值是引用,其可以作为左值进行运算
    test() += 10;

    cout << "ref = " << ref << endl;

    system("pause");
    return 0;
}

引用的本质

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

[示例]

#include <iostream>
using namespace std;

void function (int& ref){
    ref = 100;
}

int main() {
    int a = 10;

    // 这行代码相当于
    // int* const ref = &a;
    // 为我们定义了一个指针常量,其指向不可更改
    int& ref = a;
    // 发现ref是引用,相当于
    // *ref = 20;
    ref = 20;

    cout << "a: " << a << endl;
    cout << "ref: " << ref << endl;

    system("pause");
    return 0;
}

常量引用

  • 作用: 常量引用用于修饰形参,防止误操作。

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

[示例]

#include <iostream>
using namespace std;

// 增加了const修饰后,此函数体内无法修改该值的参数
void showValue(const int &val){
    cout << val << endl;
}

int main() {
    // const修饰的引用
    // 此时,代码等价于
    // int temp = 10;
    // const int& ref = temp;
    const int& ref = 10;

    // 此时ref指向的值为只读状态

    // 常量引用通常用于修饰形参,防止误操作
    int a = 100;

    showValue(a);

    system("pause");
    return 0;
}