引用
引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(reference)是c++对c语言的重要扩充。
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
引用的声明方法:类型标识符 &引用名=目标变量名;
引用说明:
(1)&在此不是求地址运算,而是起标识作用。
(2)类型标识符是指目标变量的类型。
(3)声明引用时,必须同时对其进行初始化。
(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
int a=2,int &ra=a;
a为目标原名称,ra为目标引用名。给ra赋值:ra=1; 等价于 a=1;
int main ()
{
int a = 2;
cout << a << endl;
int &b = a;
int &c(a);
cout << b << endl;
cout << c << endl;
b = 1;
cout << b << endl;
cout << c << endl;
}
输出:
2
2
2
1
1
(5)对引用求地址,就是对目标变量求地址。&ra与&a相等。即我们常说引用名是目标变量名的一个别名。别名一词好像是说引用不占据任何内存空间。但是编译器在一般将其实现为const指针,即指向位置不可变的指针。即引用实际上与一般指针同样占用内存。
(6)不能建立引用的数组。因为数组是一个由若干个元素所组成的集合,所以无法建立一个由引用组成的集合。但是可以建立数组的引用.
例如: int& ref [3]= {2,3,5};//声明ref引用的数组错误
但是可以这样写:
const int (&ref)[3] ={2,3,5}; //gcc编译的时候加上选项 -std=c++0x
ref[0] = 35; //错误
为什么要加上const ,因为{2,3,5}此时是个字面值数组,是保存在代码段里,只读的属性,如果不加,编译错误,而且后面对ref[0]的赋值也不会成功.
int main ()
{
int a[2] = {1,2};
cout << a[0] << " " << a[1] << endl;
const int (&b)[2] = a;
cout << b[0] << " " << b[1] << endl;
// b[0] = 2; 赋值失败,简单理解为const
a[0] = 3;
cout << a[0] << endl << b[0];
}
输出:
1 2
1 2
3
3
需要特别强调的是引用并不产生对象的副本,仅仅是对象的同义词。
class Base
{
public:
void show()
{
cout << "father A\n";
}
};
class De:public Base
{
public:
void show ()
{
cout << "son B\n";
}
};
指针
int main ()
{
Base *a;
De b;
a = &b;
a->show(); //指针只能用->
return 0;
}
引用
int main ()
{
De b;
Base &a = b; //Base a = b;
a.show();
return 0;
}
输出:
father A