您的位置:首页 > 编程语言 > C语言/C++

从c到c++<三>

2015-10-11 22:59 302 查看


[b]引用是给一个变量起别名
[/b]回顾下变量,它有这两个属性:名称和空间。而引用不是变量,它仅仅只是变量的别名,没有自己的独立空间,需要与它所引用的变量共享空间,所以对于引用所做的改变实际上是对它所引用的变量的改变。

[b]定义引用的一般格式:



[/b]下面用程序来说明下:



编译:



由上面的输出结果可以得出结论:定义引用时一定要初始化,指明该引用变量是谁的别名。
所以修改程序如下:



这时编译就正常了,下面给它进行赋值:



编译运行:







这如何来解释呢?“引用一经初始化,就不能重新再指向其它变量了”,所以:



在实际应用中,引用一般用作参数传递与返回值【关于这点,在后面一点进行说明】





下面用程序来验证一下:





思考一下,为什么C++不允许非const引用指向const变量呢?原因很简单,如果允许的话,那可以这样写:



下面如果是这种情况呢?



实际上是跟上一步的相反,那这能编译通过么?



也就是常量引用能指向变量,那能通过引用来更改变量的值么?





这个也很容易理解,只要是常量都不能进行更改。





下面来输出一下值:





可以看出,ref4精度确实丢失了,而我们知道引用是跟变量共享空间的,那应该值也是一样的呀,这个结果不相违背了么,实际上并没有违背,原因如下:







说了这么多跟const引用相关的知识点,其实最常用的也就是它不能再赋值。



在c语言中形参传递分为值传递和指针传递,前者是形参不能更改实参,而后者是能做到形参更改实参的,而这个引用传递也能做到更改实参,下面来介绍下它:



下面用一个两数交换的例子来说明下引用作为形参的写法:

#include <iostream>
using namespace std;
void swap(int &x, int &y);
int main(){
int a, b;
a = 10;
b = 20;
swap(a, b);
cout<<"a="<<a<<"b="<<b<<endl;
return 0;
}
void swap(int &x, int &y){
int temp;
temp = x;
x = y;
y = temp;
}


程序运行结果如下:





而其中引用的初始化是在参数调用中进行的:



而能实现数值交换的根本原来是由于引用共享变量的空间,对引用的更改也就是对变量的更改。



引用的另一个作用是用于返回引用的函数。

函数返回引用的一个主要目的是可以将函数放在赋值运算符的左边。
下面用程序来实验一下:



程序输出:



这个输出结果也是由于引用的作用,该引用是在函数返回的时候进行初始化,而index(3)在函数返回的时候将其引用初始化了a[3],所以对index(3)做的改变实际上也就是对a[3]做的改变,所以就这是为什么是这个结果的原因。

【注意】:不能返回对局部变量的引用,下面也用程序进行说明:



编译运行:



乍看好像很正常,但是:



这时再来看结果:



这是为什么呢?







这是因为:





[b]引用访问一个变量是直接访问,而指针是间接访问。[/b]

[b]引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。[/b]

[b]引用一经初始化不能再引用其它变量,而指针可以。[/b]

[b]尽可能使用引用,不得已时使用指针。
[/b]这是由于:
值传递:实参要初始化形参数需要分配空间,将实参内容拷贝到形参。
引用传递:实参初始化形参数时不分配空间。
指针传递:本质是传递,实参初始化形参的时候,也是要分配空间的,分配的是4字节的空间(32位系统),如果我们要修改指针的地址,单纯用指针传递也是不行的,需要用指针的指针(**)或引用指针(*&)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: