C++引用类型详解
在 C++ 中可以定义“引用”。定义方式如下:
类型名 &引用名 = 同类型的某变量名;
此种写法就定义了一个某种类型的引用,并将其初始化为引用某个同类型的变量。“引用名”的命名规则和普通变量相同。
函数的返回值可以是引用。例如下面的程序:
#include <iostream>
using namespace std;
int n = 4;
int & SetValue()
{
return n; //返回对n的引用
}
int main()
{
SetValue() = 40; //返回值是引用的函数调用表达式,可以作为左值使用
cout << n << endl; //输出40
int & r = SetValue();
cout << r << endl; //输出40
return 0;
}
参数传值
在 C++ 中,函数参数的传递有两种方式:传值和传引用。在函数的形参不是引用的情况下,参数传递方式是传值的。传引用的方式要求函数的形参是引用。
一个程序在运行时,其所占用的内存空间有一部分被称作“栈”,当一个函数被调用时,在“栈”中就会分配出一块新的存储空间,用来存放形参和函数中定义的变量(也称为局部变量,如上面程序中的 tmp)。实参的值会被复制到栈中存放对应形参的地方,因此形参的值才等于实参。函数执行过程中对形参的修改,相当于只是修改了实参的一个拷贝,因此不会影响实参。
参数传引用
如果函数的形参是引用,那么参数的传递方式就是传引用的。在传引用方式下,形参是对应的实参的引用。也就是说,形参和对应的实参是一回事,形参的改变会影响实参。
常引用
定义引用时,可以在前面加 const 关键字,则该引用就成为“常引用”。
常引用和普通引用的区别在于:不能通过常引用去修改其引用的内容。注意,不是常引用所引用的内容不能被修改,只是不能通过常引用去修改而已,但可以用别的办法修改。
int n = 100;
const int & r = n;
r = 200; //编译出错,不能通过常引用修改其引用的内容
n = 300; //没问题,n的值变为300
注意,const T& 和 T& 是不同的类型。T& 类型的引用或 T 类型的变量可以用来初始化 const T & 类型的引用,const T 类型的常变量和 const T & 类型的引用则不能用来初始化 T & 类型的引用,除非进行强制类型转换。