const 修饰引用
我们知道,const 是修饰一个数据为常量,而“引用”是给变量取一个别名,起到指针的作用,但是比指针容易操作。
所以,在C++开发中,为了达到“形参的改变,引起实参的变化”,可以把参数定义为一个引用。但是,有时候,我们为了在函数中,形参不能够被修改,起到保护的作用,就可以把这个形参引用定义为const类型。
const 修饰的引用,就表示这个引用的值不能够被修改。定义的格式如下:
const 类型说明符 & 引用名;
例如 :
int x = 12689;
const int &y = x; //定义y 是一个常量(常引用),所以,y 的值不能修改;
y = 123; //错误,因为y 是一个常量,所以,其值不能修改;
注意:这种情况下,只有引用y是常量,变量x还是普通的变量,变量x的数据还是可以被修改。
使用这一方法,我们可以在函数的设计中,定义const类型的引用,保护形参不能够被修改。测试例子如下:
因为 y 变量是 const 类型的引用变量,所以,执行:
y = 888;
此时,修改引用变量y的值,是非法的操作。所以,通过这种方式,保护变量x的数据在func()函数中不被修改。
引用类型的参数
在Linux C课程中,我们学习了函数的定义,了解函数形参和实参的关系。在函数的定义中,形参使用指针类型,那么,可以实现形参的变化,引起实参的改变。
那么,在C++中,函数的形参使用“引用”类型,可以实现类似“指针”的功能,形参的变化可以引起实参的改变。如下是一个具体的测试代码。
所以,调用switch_val()函数,如下:
switch_val(x, y);
此时,对引用形参的初始化,是在函数调用的时候,通过实参传递给形参来实现的。当在main()函数中调用switch_val (x, y) 的时候,有实参把变量名传递给形参,所以,相当有:
int &a = x; // a 就为 x 的别名
int &b = y; // b 就为y 的别名
所以,a和 x 代表同一个变量,b和y代表同一个变量。在switch_val ()函数中使 a 和 b 的值对换,显然,x和y的值同时改变了。
用了引用的方法,就轻而易举地解决了两个变量相互换值的问题。
C++调用函数时有两种传递数据的方式,一种是常用的方法:将实参的值传递给形参,形参是实参的一个拷贝。这种方式称为:传值方式调用(call by value)。另一种是将实参的地址传给引用型形参,这时,形参与实参是同一个变量,这种方式称为:引用方式调用(call by reference)。
注意:用引用能完成的工作,用指针也能够完成。但引用比指针的使用更直观,方便,直截了当,容易理解。有些过去只能用指针来处理的问题,现在,可以用引用来代替,从而降低了程序设计的难度。