3. 常引用

在 C++ 语言中,可以使用 const 类型说明符来创建常引用。常引用可以绑定普通变量,也可以绑定常变量,甚至可以绑定常量或临时值(也是右值,后面才讲)。

语法

const 类型 & 常引用名=变量或常量;

说明

正确用法

double e = 2.71828;  // e是变量
const double pi = 3.14159; // pi 是常变量

// 以下是合法的引用
const double &re = e;  // 引用变量
const double &rpi = pi;  // 引用常变量
const double &rc = 123.456;  // 引用常量
const double &rx = 1.2 + 3.4;  // 引用临时值(右值)

错误用法

const double pi = 3.14159; // pi 是常变量

double &rpi = pi;  // 错误的引用了常变量
double &rc = 123.456;  // 错误的引用了常量
double &rx = 1.2 + 3.4;  // 错误的引用了临时值

赋值语句不能通过常引用改变被引用变量的值。但变量可以通过赋值语句改变自身的值,一旦变量改变,常引用的内容也会被改变。

例如

double e = 2.71828;  // e是变量
const double &re = e;  // 引用变量

cout << "e:" << e << " re:" << re << endl;
e = 123.456; // 合法且e 和 re 的值都会改变
cout << "e:" << e << " re:" << re << endl;
// 以下是不合法的操作,不能通过常变量修改e的值
// re = 654.321; // 合法且e 和 re 的值都会改变

常引用用于函数的参数

当我们编写 C++ 的函数时,如果函数内部不通过该形参去修改实参(即函数内部对其只读),则可以使用常引用的方式传递实参的内容。此种方法尤其对占用内存较大的实参数据尤为有效,且有利于编译器优化。

示例

// filename: const_refrence.cpp
#include <iostream>

using namespace std;

// 传递常引用
double myadd1(const double &x, const double &y) {
    return x + y;
}
// 传递引用
double myadd2(double &x, double &y) {
    return x + y;
}

int main(int argc, char * argv[]) {
    double a = 1.2; 
    double b = 3.4;

    cout << myadd1(a, b)<< endl;
    cout << myadd1(5.6, 7.8)<< endl;

    cout << myadd2(a, b)<< endl;
    // 以下一行会报错,常量不能赋值给普通引用
    // cout << myadd2(5.6, 7.8)<< endl;

    return 0;
}

编译和运行结果如下

weimz@mzstudio:~$ g++ -o const_refrence const_refrence.cpp
weimz@mzstudio:~$ ./const_refrence 
4.6
13.4
4.6

实验

尝试使用常引用。