int rats;
int & rodents = rats;
rats:老鼠
rodents:啮齿动物。
第二行代码使啮齿动物成为了老鼠的别名。
? ? ? ? 其中,&不是地址运算符,而是类型标识符的一部分。就像声明中的char*指向char的指针一样,int &指的是指向int的引用。上述引用声明允许将rats和rodents互换——它们指向相同的值和内存单元。
#include <iostream>
using namespace std;
int main()
{
int rats = 10;
int & rodents = rats;
cout << "rats = " << rats << endl;
cout << "rodents = " << rodents << endl;
rodents++;
cout << "rats = " << rats << endl;
cout << "rodents = " << rodents << endl;
cout << "&rats = " << &rats << endl;
cout << "&rodents = " << &rodents << endl;
return 0;
}
? ? ? ? ?第一次接触引用可能会有些困惑,因为有些人很自然地想到了指针,但是它们之间还是有区别的。例如,可以创建指向rats的引用和指针:
int rats = 101;
int & rodents = rats;
int * prats = &rats;
? ? ? ? 表达式rodents和*prats都可以和rats互换,而表达式&rodents和prats都可以同&rats互换。从这点来看,引用很像指针的另一种用法(其中,*接触引用运算符被隐式理解)。但是实际上,引用还是不同于指针的。除了表示法不同外,还有其他的差别。例如,差别之一是,必须在声明引用时将其初始化,而不能像指针那样,先声明,再赋值:
int rat;
int & rodent;
rodent = rat;
上述代码是错误的,必须在声明引用变量时进行初始化。
? ? ? ? 引用更接近const指针,必须在创建时进行初始化,一旦与某个变量关联起来,就将一直效忠于它。
int & rodents = rats;
????????实际上是下述代码的伪装:
int * const pr = &rats;
? ? ? ? 其中,引用rodents扮演的角色与表达式*pr相同。
#include <iostream>
using namespace std;
int main()
{
int rats = 101;
int & rodents = rats;
cout << "rats = " << rats << endl;
cout << "rodents = " << rodents << endl;
rodents++;
cout << "rats = " << rats << endl;
cout << "rodents = " << rodents << endl;
cout << "&rats = " << &rats << endl;
cout << "&rodents = " << &rodents << endl;
int bunnies = 50;
rodents = bunnies;
cout << "bunnies = " << bunnies << endl;
cout << "rodents = " << rodents << endl;
cout << "rats = " << rats << endl;
cout << "&bunnies = " << &bunnies << endl;
cout << "&rodents = " << &rodents << endl;
return 0;
}
? ? ? ? 最初,rodents引用的是rats,随后程序尝试把rodents作为bunnies的引用:
rodents = bunnies;
????????但是可以发现rats和rodents的值变成了50,同时rats和rodents的地址是相同的,而其地址和bunnies的地址不同。也就是说,这个代码的意思是把bunnies变量的值赋值给了rat变量。所以我们知道,可以通过初始化声明来设置引用,但是不能通过赋值来设置。