从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位系统),如果我们要修改指针的地址,单纯用指针传递也是不行的,需要用指针的指针(**)或引用指针(*&)。
相关文章推荐
- STL之简单空间适配器实现
- 欢迎使用CSDN-markdown编辑器
- C语言全局变量初始化、数据类型长度
- C++之顺序容器
- C++primer学习:智能指针与动态内存(1)
- 在C++/MFC中利用CMarkup类对XML进行操作
- poco c++ 框架: Util 读取配置文件
- 项目35.4 贪财的富翁
- 项目35.3 Bessel函数
- leetcode笔记:Isomorphic Strings
- C++标准模板库------容器
- C语言中的变量
- C++ string流介绍
- C/C++基础总结(一)
- C++Primer第四章
- C语言中参数执行顺序及a++与++a实现的区别
- 关于C++中的友元函数的总结
- C++中关于public、protect、private的访问权限控制
- c/c++ 引用计数
- OpenCV(C++版)图像读取,创建,复制,保存,显示