明确C++中引用的本质

一般的教材上讲到引用时,都是说“引用是对象的一个别名”。 我认为这种定义是不清晰的,不利于初学者理解引用。至少我自己曾经被这个定 义困扰了一段时间。到底什么是“别名”?

实际上,引用的实质是位于xxxxxx地址上的一个xxxx类型的对象。比如教科 书上常用的例子:

int a = 5; //不妨假设编译器将a分配到0x400000

int &b = a;

这里面b的准确意义就是,放在0x400000地址上的一个int类型对象。这里面 包括了两重含义,首先b是一个int类型对象,因此他的使用完全与int类型对象 一样。另外这个int类型对象的地址是0x400000,因此从底层来看,它具有指针 的一些特性,无论你怎样传递,他都代表放在0x400000的那个int.

在c++中,引用全部是const类型,定义之后不可更改。实际上“引用 ”对目标代码来说是不存在的,因为对于编译器来说,使用上例中的b就是 使用0x400000地址的那个int.引用一经定义,就不会指向别的地址,也不会指向 别的类型,因此编译器不会专门开辟空间存储这个引用,而是将发送引用的地方 替换为真正的地址,接收引用的地方则替换为接受指针。

在java中,数据对象也都是引用类型,但是这里的引用与C++有很大不同,他 们不是const类型,可以指向一个空值,也可以随时更改其指向的内存地址。这 实际上与C++中的指针概念完全对应。java中的引用实际上对应C++中的指针而非 引用,只不过是省去了C++中指针的取地址(&)与取值(*)操作。

时间: 2024-11-15 22:54:55

明确C++中引用的本质的相关文章

举例剖析C++中引用的本质及引用作函数参数的使用_C 语言

引用的意义与本质1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针 2)引用相对于指针来说具有更好的可读性和实用性 引用本质思考: 思考.C++编译器背后做了什么工作? #include <iostream> using namespace std; int main() { int a = 10; // 单独定义的引用时,必须初始化:说明很像一个常量 int &b = a; // b是a的别名 b = 11; cout << "b--->&quo

优就业C/C++教程-C++中引用和匿名对象的理解和本质剖析

大家对C++的引用应该都不陌生吧,抱着既要知其然,也要知其所以然的态度.下面将按照是什么?怎么用?为什么需要?本质剖析的流程来向大家一一描述. 引用是什么? 引用其实就是给变量起的一个别名,使用这个别名跟使用变量名没有区别. 那什么又是变量名呢? 变量名实质上是一段连续存储空间的别名,是一个标号(门牌号),编译器通过变量来申请并命名内存空间,程序员可以通过变量的名字可以使用存储空间. 也可以这样理解,变量名是逻辑概念,变量是物理层面,变量含数据类型和数据值,数据类型决定内存的分配,编译器将变量名

C++中引用和匿名对象的理解和本质剖析

大家对C++的引用应该都不陌生吧,抱着既要知其然,也要知其所以然的态度.下面将按照是什么?怎么用?为什么需要?本质剖析的流程来向大家一一描述. 引用是什么? 引用其实就是给变量起的一个别名,使用这个别名跟使用变量名没有区别. 那什么又是变量名呢? 变量名实质上是一段连续存储空间的别名,是一个标号(门牌号),编译器通过变量来申请并命名内存空间,程序员可以通过变量的名字可以使用存储空间. 也可以这样理解,变量名是逻辑概念,变量是物理层面,变量含数据类型和数据值,数据类型决定内存的分配,编译器将变量名

在WPS 2007邮件合并中引用特殊格式

WPS Office 2007在最新的个人版中开放了邮件合并功能.可以方便地在WPS文字中引用WPS表格或者EXCEL文档中的数据了.但是,对于一些特殊格式的数据,在进行邮件合并时,却只能引用到原始的数据,而无法带格式一起"引用"到WPS文字中来. 比如图1中的B列数据,在WPS表格中,显示为大写人民币格式. 图1 WPS表格 但用邮件合并功能引用到WPS文字中来时,却变成与A列一样的阿拉伯数字了(图2). 图2 WPS邮件合并后效果 有没有办法让B列的特殊格式"原封不动&q

android中的service本质是一个类还是一个方法还是一个对象

问题描述 android中的service本质是一个类还是一个方法还是一个对象 android中的service本质是一个类还是一个方法还是一个对象 当然我明白java中一切都是对象的这种说法 解决方案 service在哪里看到的,作为类的定义它是类,对它实例化创建了对象并且执行就是对象了. 解决方案二: java中一切都是对象 这个说法其实不准确.你能说java中的关键字是对象么? 解决方案三: Service(服务)是Android 核心组件之一,特点就是Android系统帮你实例化他的对象

详解Android XML中引用自定义内部类view的四个why_Android

今天碰到了在XML中应用以内部类形式定义的自定义view,结果遇到了一些坑.虽然通过看了一些前辈写的文章解决了这个问题,但是我看到的几篇都没有完整说清楚why,于是决定做这个总结. 使用自定义内部类view的规则 本文主要是总结why,所以先把XML布局文件中引用内部类的自定义view的做法摆出来,有四点: 1.自定义的类必须是静态类: 2.使用view作为XML文件中的tag,注意,v是小写字母,小写字母v,小写字母v: 3.添加class属性,注意,没有带android:命名空间的,表明该自

详解Android XML中引用自定义内部类view的四个why

今天碰到了在XML中应用以内部类形式定义的自定义view,结果遇到了一些坑.虽然通过看了一些前辈写的文章解决了这个问题,但是我看到的几篇都没有完整说清楚why,于是决定做这个总结. 使用自定义内部类view的规则 本文主要是总结why,所以先把XML布局文件中引用内部类的自定义view的做法摆出来,有四点: 1.自定义的类必须是静态类: 2.使用view作为XML文件中的tag,注意,v是小写字母,小写字母v,小写字母v: 3.添加class属性,注意,没有带android:命名空间的,表明该自

dll-在 v2010中引用某个Dll后 所有.net程序无法运行

问题描述 在 v2010中引用某个Dll后 所有.net程序无法运行 重装的系统及vs2010. 一切正常. 在引用某个从网上下载的mysql.data.dll后,所有的.net程序都无法运行,就像没有安装framework一样. 但用IIS加载.net网页没问题. 运行不了后尝试重装过vs2010,所有framework运行库,重注册dll,都没用. 请问不重装系统怎么破? 解决方案 估计引用dll和你的系统崩溃之间只是巧合.你的系统被流氓软件破坏了. 不重装系统要想解决除非你有足够多的钱和时

c++问题-C++的类中怎么在一个函数中引用上一层的函数

问题描述 C++的类中怎么在一个函数中引用上一层的函数 在同一个类中怎么引用先定义的函数来定义函数?比如在一个时期类的定义中,一个日期加1的函数中怎么调用先定义的一个求是否闰年的函数. 解决方案 C++定义隐式转换函数将类转换为内部的一个成员变量c++函数默认参数是一个好的设计吗? 解决方案二: 直接在函数内调用就可以了.不知道你说的上一层是什么意思.是基类的函数还是集合类所属的对象的函数,前者直接调用,或者用 基类类名::函数名后者用构造函数传对象指针 解决方案三: 同一个类中的函数都是通过t