C++引用
引用(reference)是C++对C语言的重要扩充。引用和指针具有相似的功能,都可以让你间接引用其他对象,对目标变量的内容进行直接操作。
引用的主要用途是为了描述函数的参数和返回值,特别是为了运算符的重载。
一、什么是引用
引用就是某一变量(对象)的一个别名,对引用变量的操作与对变量直接操作效果完全一样。引用与指针一样都是让你间接引用其他对象。
引用的声明方法:数据类型 &引用名=目标变量名;
引用声明允许引用和目标变量互换—它们指向相同的值和内存单元。
int a;
int &b = a; //与写法int& b = a 一样。
//a为目标原名称,b为目标引用名。
b=1; //等价于直接给a赋值 a=1;
b++; //相当于a++
- 声明引用时,必须同时对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
- &在此不是求地址运算,而是起标识作用。(巧记:&和类型在一起是引用,单独和变量在一起是取址)
- 对引用求地址,就是对目标变量求地址。&b与&a相等。编译器在一般将其实现为const指针,即指向位置不可变的指针。即引用实际上与一般指针同样占用内存。
int a = 3;
int &b = a; //&为引用
//int * const pr = &a; //常量指针,引用b扮演的角色与表达式*pr相同
//常量指针,指针指向的数值可以改变,然而指针所保存的地址却不可以改变。
int *p;
p= &a; //指针赋值,&为取地址
/*指针p与引用b都指向同一地址(变量a),输出p、&a和&b的值相等*/
引用是对指针的优化,一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。
不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。
void printDouble(const double& rd)
{
cout << rd; // 不需要测试rd,它肯定指向一个double值
}
相反,指针则应该总是被测试,防止其为空:
void printDouble(const double *pd)
{
if (pd) {
// 检查是否为NULL
cout << *pd;
}
}
指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。
string s1("Nancy");
string s2("Clancy");
string& rs = s1; // rs 引用 s1
string *ps = &s1; // ps 指向 s1
rs