参量作为函数中的参数,是函数的重要组成部分。但是,这里先简单介绍一下,参量作为一个独立的变量的应用。
首先,来了解下什么是参量。参量是在变量名前加上“&”符号而定义的一种复合的类型,这个是参照于其他类型的基础上的类型。我们不能参照参量来定义,但是可以参照任何其他的数据类型来定义参量。
参量的初始化一般使用跟他相同类型的变量来进行。如:
int ival=1024;
int &refval=ival; //ok:refval refers to ival
int &refval2; //error: a reference must be initialized
int &refval3=10; //error: initializer must be an object
在这里,我们甚至可以认为,参量就是与他捆绑的变量的别名,任何对参量进行的操作,其实都是对基础变量的操作。例如:
int ival=1024;
int &refval=ival
refval+=2;
int ii=refval;
可以看到,我们把refval加上2然后赋给了ii,事实上,这个就是把ival加上2再赋值给ii。
需要注意的是,一旦参量被初始化了,那么它就会一直跟基础变量保持绑定,不能让它再和别的变量绑定了。
—————————————————————————————————————————————————
定义多个参量
我们同样可以定义多个参量,不过这些参量必须是同一类型的。当然,我们要在参量名前加上“&”符号:
int i=1024, i2=2048;
int &r=i, r2=i2; //r is a reference, r2 is a int
int i3=1024, &ri=i3; //define one object, and one reference
int &r3=i3, &r4=i2; //define two references
—————————————————————————————————————————————————
常参量与非常参量
首先,我们先介绍下常参量。
顾名思义,常参量就是指代常变量的参量。如下:
const int ival=1024;
const int &refval=ival; //ok: both reference and object are const
int &ref2=ival; //error: non const reference to a const object
上面的定义中,我们可以读取refval的值,但是不能写入,这是因为,我们不能对ival进行写入的操作,而参量refval是指代ival的。同样,用ival初始化ref2也是不可行的:ref2是一个明码(plain)、非常参量,所以它是可以写入的,而ival是一个常变量。所以,为了避免这样的情况发生,我们在定义常变量时不能使用明码。
常变量在定义时,是可以指代不同的类型或者指代一个右值的。
下面我们举个例子来说明:
int i=42;
const int &r=42; //legal for const reference only
const int &r2=r+i;
正如上面显示的,因为常变量的指代的就是一个常量,所以,常参量指代一个常量也是合法的。但是,这仅仅适用于常参量,对于非常参量而言,这种定义会引起编译错误。
我们还是用一个例子来说明:
double ival=3.14;
const int &ri=ival;
上面的定义,在编译时会被编译器理解为:
int temp=ival; //creat temporary int from the double
const int &ri=temp //bind ri to the temporary
在这里,temp不可知是常变量还是非常变量,所以ri也不可知。那么如果ri是非常变量,我们就可以对ri赋值。通过赋值改变ri的值,实际上就是改变temp的值,但是可见ival的值并不会改变。所以,原先期望程序实现的功能并没有实现。
综上所述,一个非常参量只能绑定在与它同类型的变量上,而一个常参量则可以帮顶在相关联类型的变量或者是右值上。