C++新增了一种复合类型一引用变最。引用是己定义的变量的别名(另一个名称)。例如,如果将twain 作为clement变量的引用,则可以交替使用twain和clement来表示该变量。
创建引用变量
C和C++使用&符号来指示变簸的地址。C++给&符号赋予了另一个含义,将其用來声明引用。例,要将rodents作为rats变量的别名,可以这样做:
int rats;
int & rodents = rats; // makes rodents an alias for rats
其中,&不是地址运算符,而是类型标识符的一部分。就像声明中的char*指的是指向char的指针一样, int &指的是指向im的引用。上述引用声明允许将rats和rodents互换——它们指向相N的值和内存单元, 程序表明了这一点。
#include<iostream>
int main()
{
using namespace std;
int rats=101;
int &rodents=rats;
cout<<"rats= "<<rats;
cout<<", rodents="<<rodents<<endl;
rodents++;
cout<<"rats= "<<rats;
cout<<", rodents="<<rodents<<endl;
cout<<"rats address="<<&rats;
cout<<", rodents address="<<&rodents<<endl;
return 0;
}
运行结果:
从中可知,rats和rodents的值和地址都相同(具体的地址和显示格式随系统而异)。将rodents加1将影响这两个变量。更准确地说,rodents++操作将一个有两个名称的变最加1。
对于C语言用户而言,首次接触到引用时可能也会有些困惑,因为这些用户很自然地会想到指针,但它们之间还是有区别的。例如,可以创建指向rats的引用和指针:
int rats = 101;
int & rodents = rats; // rodents a reference
int * prats = &rats; // prats a pointer
这样,表达式rodents和*prats都可以同rats互换,而表达式&rodents和prats都可以同&rats互换。从这一点來说,引用看上去很像伪装表示的指针(其中,*解除引用运算符被隐式理解)。实际上,引用还是不同于指针的。除了表示法不同外,还有其他的差别。例如,差别之一是,必须在声明引用时将初始化, 而不能像指针那样,先声明,再赋值:
int rat;
int & rodent;
rodent = rat; //No, you can't do this.
注意:必须在声明引用变量时进行初始化。
引用更接近const指针,必须在创建时进行初始化,一但与某个变量关联起来,就将一直效忠于它。 也就是说:
int & rodents = rats;
实际上是下述代码的伪装表示:
int * const pr = &rats;
其中,引用rodents扮演的角色与表达式*pr相同。