引入

C语言中函数有两种传参的方式: 传值和传址。以传值方式, 在函数调用过程中会生成一份临时变量用形参代替, 最终把实参的值传递给新分配的临时变量即形参。 它的优点是避免了函数调用的副作用, 确无法改变形参的值。 如果要改变实参的值, 只 能通过指针传递。

 1 void swap (int left, int right)
2 {
3 int temp = left;
4 left = right;
5 right = temp;
6 }
7 void swap (int *_pleft , int * _pRight)
8 {
9 assert (NULL ! = _pleft && NULL ! = _pRight) ;
10 int iTemp = * _pleft;
11 *_pleft = * _pRight;
12 *_pRight = iTemp;
13 }

指针可以解决问题, 但不是很形象友好, 不安全, 因 此C++中 引 入了 一种新的符合类型--引用 。

引用概念

引用(reference)不是新定义一个变量, 而是给已存在的对象取了 一个别名 ,引用类型,引用另外一种类型。 编译器不会为引用对象新开辟内存空间, 它和它引用的对象共用同一块内存空间 。

1 int num = 110;
2 int &number = num; //number指向num(是num的另外一个名字)

一般在初始化变量时,初始值会被拷贝到新建的对象中。然而定义引用时程序把引用和他的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成引用家将和他的初始对象一直绑定在一块。因为无法将引用重新绑定到另外一个对象上,因此引用必须初始化。

引用即别名

引用并非对象,相反的,它只是为一个已经存在的对象所起的另外一个名字。定义一个引用之后,对其进行的所有操作都是在与之绑定的对象上进行的:

1 number = 120;      //把120赋给number指向的对象,此处即是赋给了num
2 int tmp = number; //与tmp = num执行结果一样

为引用赋值,实际上是把值赋给了与引用绑定的对象。获取引用的值,实际上是获取了与引用绑定的对象的值。同理,以引用作为初始值,实际上是以引用绑定的对象作为初始值。

引用的定义

允许在一条语句中定义多个引用,其中每个引用标识符都必须以&开头;

因为无法将引用重新绑定到另外一个对象上,因此引用必须初始化。

因为引用本身不是一一个对象,所以不能定义引用的引用。

一个变量可以有多个引用,而一个引用只能给一个变量对象 。

引用的类型要和与之绑定的对象严格匹配(不严谨)。

引用只能绑定在对象上而不能和字面值或某个表达式计算的记过绑定在一起。

1 int i1 = 10, i2 = 20 ;     //i1和i2都是int型
2 int &r1 = i1, &r2 = i2; //r1和r2都是引用
3 int &r3 ; //报错:引用必须初始化
4 int &r4 = i1, &r5 = i2; //r1, r4同为i1的引用,r2, r5同为i2的引用
5 int &r4 = i2, &r5 = i1; //报错:r4不能同时分别为i1和i2的引用
6 int &r6 = 10; //报错:引用类型的初始值必须是一个对象
7 double i3 = 3.14;
8 int &r7 = i3; //报错:此处引用类型的初始值必须是int型对象

引用与指针

相同点:

底层的实现方式相同, 都是按照指针的方式来实现的:

不同点:

有空指针,没有空引用;

引用定义时必须初始化, 指针可以不用, 正常情况下需初始化为NULL;

引用一旦定义就不能再改变, 指针可以;

sizeof求取的值不一样;

自 ++含义不同;

可以有多级指针, 但是没有多级引 用;

指针和引用的地址不同;

int**/int&&意义不同;

总结:

1、 引 用在定义时必须初始化, 指针没有要求。

2、 一旦一个引 用被初始化为指向一个对象, 就不能再指向其他对象, 而指针可以在任何时候指向任何一个同类型对象。

3、 没有NULL引 用, 但有NULL指针。

4、 在sizeof中含义不同: 引 用结果为引 用类型的大小,但指针始终是地址空间所占字节个数。

5、 引 用自 加改变变量的内 容, 指针自 加改变了 指针指向。

6、 有多级指针, 但是没有多级引用。

C++引用的作用的更多相关文章

  1. C++引用的作用和用法

    引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 引用的声明方法:类型标识符&引用名=目标变量名: 例如: int q; int &ra=a; 说明: &am ...

  2. C++—引用的作用

    引入 C语言中函数有两种传参的方式: 传值和传址.以传值方式, 在函数调用过程中会生成一份临时变量用形参代替, 最终把实参的值传递给新分配的临时变量即形参. 它的优点是避免了函数调用的副作用, 确无法 ...

  3. 引用的作用&引用与指针的区别

    引入 C语言中函数有两种传参的方式: 传值和传址.以传值方式, 在函数调用过程中会生成一份临时变量用形参代替, 最终把实参的值传递给新分配的临时变量即形参. 它的优点是避免了函数调用的一些副作用, 但 ...

  4. Unity3D-ScrollRect 各参数的代码引用以及作用

    版本Unity4.6: 以下为ScrollRect面板上各选项 对应 在代码里的属性: content(RectTransform): scrollRect的RectTransform组件,即滑动面板 ...

  5. UGUI ScrollRect 各参数的代码引用以及作用

  6. php中引用&的真正理解-变量引用、函数引用、对象引用

    php的引用(就是在变量或者函数.对象等前面加上&符号) //最重要就是 删除引用的变量 ,只是引用的变量访问不了,但是内容并没有销毁 在PHP 中引用的意思是:不同的名字访问同一个变量内容. ...

  7. PHP引用(&)使用详解

    初学php关于&引用 官方文档: 1.引用是什么:http://www.php.net/manual/zh/language.references.whatare.php 2.引用做什么:ht ...

  8. php中关于引用(&)详解

    php中关于引用(&)详解 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的变量名访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的 ...

  9. c++的引用

    /*#include"iostream"using namespace std;void any_function(int & p);//声明函数any_function/ ...

随机推荐

  1. Mac之OS系统下搭建JavaEE环境 <三> 之Eclipse 与 IntelliJ IDEA 的安装配置

    三.Eclipse 与 IntelliJ IDEA 的安装配置 1.Eclipse的安装配置 1 下载eclipse 到官网 https://www.eclipse.org/downloads/ecl ...

  2. 几个SQL语句(备忘)

    1.三涨停 select biao1.代码,biao1.名称 from biao1,biao2,biao3 where (biao1.涨幅+ biao2.涨幅+biao3.涨幅)>0.27 an ...

  3. Microsoft office2010页码设置----论文、课程设计报告格式

    思想:将目录页(含目录页)与目录页以下的页面用分隔符分隔开,单独设置目录页以下的页面页码,删除目录页(含目录)以前的页码. 1.在目录页页面内容最下面一行插入分隔符,实现与下面页面分隔开的目的. 页面 ...

  4. ASP.NET Core之跨平台的实时性能监控

    前言 前面我们聊了一下一个应用程序 应该监控的8个关键位置. . 嗯..地址如下: 应用程序的8个关键性能指标以及测量方法 最后卖了个小关子,是关于如何监控ASP.NET Core的. 今天我们就来讲 ...

  5. 95后实习生的远程办公体验(asp.net mvc\C#技术栈)

    这个月我们做了一件别人看起来很疯狂的事情,就是让一批95后的实习生实行远程办公,效果还不错,于是写此文总结一下. 其实认真算算,我自己的远程工作经验有十年了吧,在北京工作的时候天气不好就申请在家办公, ...

  6. CJOJ 1494 【网络流24题】 搭配飞行员(二分图最大匹配)

    CJOJ 1494 [网络流24题] 搭配飞行员(二分图最大匹配) Description 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾 ...

  7. java用户界面窗口

    java用户界面窗口 窗口框 代码如下: package Day08; import java.awt.Color;import java.awt.FlowLayout;import java.awt ...

  8. 使用travis-ci自动部署github上的项目

    travis-ci是什么? 一个使用yaml格式配置用于持续集成完成自动化测试部署的开源项目 官网:https://travis-ci.org/ 使用travis-ci集成vue.js项目 首先,您需 ...

  9. pc端的企业网站(IT修真院test9)详解一个响应式完成的pc端项目

    一:引入bootstrap框架 昨天一直被bootstrap栅格系统折磨. why? 我本来想一边码字,一边学习栅格布局的.but不成功.这时我头脑已经昏了. 下午,我查看了bootstrap的官网, ...

  10. 利用Fiddler修改请求信息通过Web API执行操作(Action)实例

    本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复261或者20170724可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...