引用是 C++中的概念,刚开始的时候我容易把引用和指针混淆一起。如下程序中,n 是 m 的一
个引用(reference),m 是被引用物(referent)。
int m;
int &n = m;
n 相当于 m 的别名(绰号),对 n 的任何操作就是对 m 的操作。例如有人名叫李三,他的绰号是“傻蛋”。说“傻蛋”怎么怎么的,其实就是对李三说三道四。所以 n 既不是 m 的拷贝,也不是指向 m 的指针,其实 n 就是 m 它自己。
这里重点说一下引用的一些个规则:(自己总结的请大家指教)
(1)引用被创建的时候,必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有 NULL 引用(指针则可以是 NULL),引用必须与存储单元相对应,一个引用对应一个存储单元。就好比你和你女朋友绑在一起,谁也离不开谁。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象),这个更好说,当你和你的女朋友邦定在一起的时候,你就必须遵循你女朋友的约束嘿嘿。
这里有个例子,比如说:
int i = 5;
int j = 6;
int &k = i;
k = j; // k 和 i 的值都变成了 6;
这里K被初始化为i的引用,在语句“k = j;”并不能把K修改为j的引用(就像你和你女朋友结婚了,那么法律上只承认你女朋友是你的妻子,你和别的女人搞在了一起,对不起法律不承认)。如果你非要这样绑定,也可以,这样的话,把 k 的值改变成为 6。由于 k 是 i 的引用,所以 i 的值也变成了 6。这样一来你就害了两个人啊 。
上面的程序看起来象在玩文字游戏,没有体现出引用的价值。引用的主要功能是传递函数的参数和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。
以下是“值传递”的示例程序。由于 Func1 函数体内的 x 是外部变量 n 的一份拷贝,
改变 x 的值不会影响 n, 所以 n 的值仍然是 0。
void Func1(int x)
{
x = x + 10;
}
int n = 0;
Func1(n);
cout << “n = ” << n << endl;// n = 0
以下是“指针传递”的示例程序。由于 Func2 函数体内的 x 是指向外部变量 n 的指
针,改变该指针的内容将导致 n 的值改变,所以 n 的值成为 10。
void Func2(int *x)
{
(* x) = (* x) + 10;
}
…
int n = 0;
Func2(&n);
cout << “n = ” << n << endl; // n = 10
以下是“引用传递”的示例程序。由于 Func3 函数体内的 x 是外部变量 n 的引用,x
和 n 是同一个东西,改变 x 等于改变 n,所以 n 的值成为 10。
void Func3(int &x)
{
x = x + 10;
}
…
int n = 0;
Func3(n);
cout << “n = ” << n << endl; // n = 10
对比上述三个示例程序,会发现“引用传递”的性质象“指针传递”,而书写方式象
“值传递”。实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”
这东西?
答案是“用适当的工具做恰如其分的工作”。
指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大,但是非常危险。
就象一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用?
如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,
以免发生意外。比如说,某人需要一份证明,本来在文件上盖上公章的印子就行了,如
果把取公章的钥匙交给他,那么他就获得了不该有的权利。
引用不是变量,系统并不为引用分配存储空间,它本身没有地址,其地址是原变量的地址,
指针变量是变量,系统为其分配存储空间。
引用是变量的别名,可以通过别名直接访问某个变量,而指针变量的值是变量的地址,指针是通过地址间接访问某个变量。
引用必须初始化,而初始化之后不能再做其他变量的别名。
引用的主要用途是做函数的参数和函数的返回值,而引用作为函数的形参,通过引用改变主调函数中的实参,是C++引进引用的主要目的之一。
通过引用传递函数参数,主调函数只能向被调函数传递变量,不能向被调函数传递常量和表达式,因为常量和表达式的地址,编译器无法传递。
标准C中可以使用void的指针去指向任何指针类型,如:
int x;
int *ptr;
void *pt1r=&x;
而在C++中这是不合法的。如果必须这样做,则须强制进行类型转换,即:
ptr=(int *)ptr1;
引用的使用
在C中用指针传递参数地址,但是,指针的使用非常复杂,容易出错。C++采用了引用的概念,它是一种间接的指针。引用可为变量起别名,主要用于参数传递和做函数的返回类型。
1.引用的定义
引用定义的关键字是“type &”,含义是定义一个type类的引用,此引用可与type类对象或变量的地址相联系。如:
int I=5;
int &j=I;
含义是:创建一个整型引用,j是I的别名,它们公用一个内存地址。
说明:
(1) double & rr=1; 等价与 double temp; temp=double(1); double & rr=temp;
(2) int *a; int * & p=a; int b=8; p=&b; //正确,指针变量的引用
void & a=3; //不正确,没有变量或对象的类型是void
int & ri=NULL; //不正确,有空指针,无空引用
(3) int & ra=int; //不正确,不能用类型来初始化
int *p=new int; int & r=*p; //正确
(4) 引用不同于一般变量,下面类型声明是非法的:
int &b[3]; //不能建立引用数组
int & *p; //不能建立指向引用的指针
int &&r; //不能建立引用的引用
(5) 当使用&运算符取一个引用的地址时,其值为所引用变量的地址,
2.引用参数
引用的一个重要应用就是作为函数的参数。在使用引用做参数时不必使用*,并且又没有地址与变量本身的差别,从而简化了程序,
3. 引用和指针使用原则
1.在可以用引用的情况下,不要用指针;
2.引用不允许重新赋值.,当使用一个变量指向不同的对象时,必须用指针;
3.引用不允许为空,当存在对象为空时,必须使用指针。