深入理解指针和引用的区别及引用与原值的区别

用法上的基本区别(包括sizeof和typeid)就不多说了,相信大家都了然于心,不清楚随便google一下也有一大堆。

下面从对象模型的角度去深入的谈谈指针和引用的区别,亦我们有了指针,为什么还要用引用。

1) 形式

  这里所说的形式指的是运算符重载时的形式一致,事实上,在c++中,只有运算符有形式上确定的规定,因此,在重载[]运算符时,为了保持形式的一致性,就必须使用引用。

2) 临时变量

  可以用const A&来引用一个临时变量(这同时证明了临时变量是有地址的,只不过该地址不能通过&取得),这保证了可以用临时变量来进行赋值。任何指针都不能指向临时变量,因为不恩不能通过&取得临时变量的地址。

3)  运算符重载

*运算符可以重载(可以重载就可以被禁用),而引用不可以重载,即不能被禁用。

以type_info类为例,

当一个类的构造函数被禁用后,就不能进行一般的变量初始化,type_info类构造函数被禁用

因此,(const)type_info t=typeid(a);是不合法的,会发生编译错误。

但是,我们知道一个类的指针变量是不调用构造函数就可以产生的,所以

理论上,(const)type_info *t=&typeid(a);是合法的,前提是*可用,一旦通过运算符重载禁用*(不可重载&),则这种方法也是不可以的。

此时,我们只能通过引用来捕获该变量。

(const )type_info &t=typeid(a);

事实上const A& t=typeid(a)这句是始终成立而不可以被禁用的,任何一个非抽象类的const引用变量都是可以捕获的,对于一些特殊设计的功能类,我们不希望对他进行修改、赋值等复杂运算,就可以将其设计成只有const A&变量的类。

引用与原值的区别(一重性):

  引用的地址是const A*类,而原值的地址是A*类型。

  值当然可以被引用,但是引用只能被const引用引用。

::上述两点保证了引用的一重性,引用的指针或者引用都不能再修改原值了。

深入理解指针和引用的区别及引用与原值的区别

时间: 2024-11-17 08:11:21

深入理解指针和引用的区别及引用与原值的区别的相关文章

指针与引用的区别以及引用的三种用法

1.指针与引用的区别: 指针是一块内存的地址值,而引用是一块内存的别名. 下面引自:http://www.cnblogs.com/kingln/articles/1129114.html 从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一

[引用区别] c++中引用与java中引用区别

综述: 在Java中,类实例声明和构造是分开."T a;"是声明,而"a=new T();"才是构造.引用声明和C++相同.但是Java的机制与C++不同,Java中的引用也叫句柄,或者说句柄才是其真实名称.类声明的都是一个句柄,调用构造函数才会使得句柄指向类实例.因此Java中没有类似于C++中的复制函数,因为Java的复制都是直接复制句柄内容.例如"T b=a;"只不过是将a的句柄复制(赋值)给了b,从而b也指向a指向的类实例.可以看出Jav

WPF中静态引用资源与动态引用资源的区别

WPF中静态引用资源与动态引用资源的区别 WPF中引用资源分为静态引用与动态引用,两者的区别在哪里呢?我们通过一个小的例子来理解. 点击“Update”按钮,第2个按钮的文字会变成“更上一层楼”,而第1个按钮的文字没有变化. 原因是第1个按钮文字用的是静态引用资源,而第2个按钮文字用的是动态引用资源. 前台代码: <Window x:Class="PersonalLearning.StaticDynamicResourceDemo"        xmlns="http

理解PHP的变量,值与引用的关系

--- title: 理解PHP的变量,值与引用的关系 createdDate: 2015-03-11 category: php --- PHP的变量与C++中的变量是两种截然不容的概念.如果没有理解清楚,使用C++的方式来思考PHP就会遇到一些问题. C++中,变量与值是绑定的.值是内存的上的一块内存上的数据,而变量则是操作这块内存的名称.变量消失(比如超出作用域)值也会消失. 而PHP中,变量和值是两个概念.PHP是一种弱类型语言,值在PHP的内部(zend引擎),被存放在一个zval结构

C/C++心得-理解指针

上一篇笔者用那不是怎么好理解的逻辑介绍了内存和C中的基本数据类型,现在笔者再根据自己重新所学来说说C语言中的指针. 理解指针才能真正的算C语言入门.也许是我大学期间太关注前端UE,也许是当初开始学C语言的时候没怎么认真:直到毕业后的某一天我才“懂”指针,才算理解C语言的伟大.如果早点理解它,可能我毕业时就会选择一份不一样的工作.如果有初学C语言的同行对指针有困惑,希望我这浅薄的认识能帮助你. 1.简介 指针在原英文中为pointer,个人觉得翻译过来后针的含义不如指的含义好理解,pointer还

【C语言天天练(十一)】深入理解指针

引言:在C语言中,指针的地位是不言而喻的,要想很好的掌握C语言,掌握指针是必须的,这也是C语言不同于其他语言的地方. (一)指针的指针 例子: int i; int *pi;/*把pi初始化为指向变量i,pi = &i*/ int **ppi;/*把ppi初始化为指向变量pi,ppi = &pi*/ 初始化指针后,就可以使用它们了.例如i = 'a'; *pi = 'a'; **ppi = 'a';具有相同的效果. 在一条简单的对i赋值的语句可以完成的任务情况下,为什么还要使用更为复杂的涉

理解指针

如题:理解指针 VS如何看汇编代码(DEBUG状态) Debug->Windows->DisAssambly即可看到汇编窗口 先看看C++代码 int _tmain(int argc, _TCHAR* argv[]) { /* char temp[100] = "c:\abc\bcd\cde \n"; char temp2[100] = "c:/abc/bcd/cde \n"; char temp3[100] = "c:\\abc\\bcd\\

深刻理解Java中形参与实参,引用与对象的关系

声明:本博客为原创博客,未经允许,不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/30989755 我们都知道,在Java中,除了基本数据类型之外,其他的都是引用类型,当它们作为函数参数时,传递的也是引用,通过引用可以改变对象的值,很多人便因此而忽略形参与实参,引用与对象的关系问题.废话不多说,先看下面一个例子: import java.util.*; public class Student { private String

添加web引用和添加服务引用有什么区别?

添加web引用和添加服务引用有什么区别,Add Service References 和 Add Web References 有啥区别?参考 http://social.microsoft.com/Forums/zh-CN/xmlwebserviceszhchs/thread/808d870b-49f1-47ac-b105-4beb580bcec6 (1)VS2005里提供的Add Web Reference(添加Web服务引用)的功能主要是添加Web Service引用.(2)VS2008保