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
实验
尝试使用常引用。