引用是个别名。

1、引用是否占用空间

引用是否占用空间,此处是指广义上的占用内存空间,即为该对象新开辟一块内存。这个需要分不同的情况。

首先看一下常引用(const 引用)。

这里关于常引用在c++ primer中有如下描述:

1、const引用是指向const的引用。

2、非const引用只能绑定到与该引用同类型的对象;const引用则可以绑定到不同但是相关的类型的对象或绑定到右值。

重点看第二条的第二句话。

看如下例子:

int a = ;
const int &b = ;
const int & c = r+;

以上都是合法的代码。

根据c++primer上面对不同类型情况下的解释就会更加的清楚:

double a = 3.14;
const int & b = a;

上述代码等同于:

double a = 3.14;
int tmp = a;
const int &b = tmp;

通过打印变量的地址也可以看出不同来。

int a = ;
int &b = a;
printf("&a = %p &b = %p\n",&a,&b); double c = 3.14;
int &d = c;
printf("&c = %p &d = %p\n",&c,&d);

由此可以看出,当常引用不同类型的对象时,会分配空间,但是由于是const,该空间也只能读取。

从狭义上看引用本身是否占用内存,先看一下《c++语言程序设计》(清华出版241页)中的一段话:

  “本书引入引用概念时,曾将引用介绍为其他变量的别名。但是对于一个确定的引用来说,他可能在不同的时候表示不同变量的引用的别名,因此一定要在内存中为引用本身分配空间,来标识其所引用的变量。在程序运行时,变量只能依靠地址来区别,因此,只有通过存储被引用变量的地址,在运行时才能准确的定位被引用的变量。引用本身所占用的内存空间中,存储的就是被引用变量的地址,这和指针变量所存储的内容具有相同的性质。

      ......

   引用本身(而非被引用对象)的地址是不可以获得的,引用一旦定义后,对他的全部行为,全是针对被引用对象的,而引用本身所占用的空间则被完全隐藏起来了。”

  由此可以看出一些端倪来。

  个人理解:引用是一个逻辑概念,有些东西和具体实现有关。

关于c++中的引用的更多相关文章

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

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

  2. 浅谈Java中的引用

    在Java语言中,引用是指,某一个数据,代表的是另外一块内存的的起始地址,那么我们就称这个数据为引用. 在JVM中,GC回收的大致准则,是认定如果不能从根节点,根据引用的不断传递,最终指向到一块内存区 ...

  3. error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用

    MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 Debug ...

  4. c++中的引用与指针的区别

    http://blog.csdn.net/lyd_253261362/article/details/4323691 c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存 ...

  5. CSAPP读书随笔之一:为什么汇编器会将call指令中的引用的初始值设置为-4

    CSAPP,即<深入理解计算机系统:程序员视角>第三版,是一本好书,但读起来确需要具备相当的基本功.而且,有的表述(中译文)还不太直白. 比如,第463页提到,(对于32位系统)为什么汇编 ...

  6. 转 mvc项目中,解决引用jquery文件后智能提示失效的办法

    mvc项目中,解决用Url.Content方法引用jquery文件后智能提示失效的办法   这个标题不知道要怎么写才好, 但是希望文章的内容对大家有帮助. 场景如下: 我们在用开发开发程序的时候,经常 ...

  7. 内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

    内部类访问外部类的变量必须是final吗? 如下: package com.java.concurrent; class A { int i = 3; public void shout() { cl ...

  8. 理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...

  9. VB6中的引用传递 与 VB.NET中的引用传递的区别

    首先注意一点,在VB6中缺省参数传递的方式是:引用传递,而在VB.NET中缺省参数传递的方式是:值传递. 然后我们看下面VB6中的引用传递与VB.NET中的引用传递的对比. VB6中的引用传递 Pri ...

  10. [转] 深入探讨C++中的引用

    引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确.灵活地使用引用,可以使程序简洁.高效.我在工作中发现,许多人使用它仅仅是想当然,在某些微妙的场合,很容易出错,究其原由,大多因为没有 ...

随机推荐

  1. XP系统VPN设置

    为了解除公司上网策略限制,或者为了上Google,Facebook,都可以通过设置VPN实现. 要使用VPN需要到VPN服务商注册,链接VPN服务商. ======================== ...

  2. Linux怪哉ntfs

    http://www.linuxidc.com/Linux/2013-08/88721.htm

  3. 【POJ3691】 DNA repair (AC自动机+DP)

    DNA repair Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Description B ...

  4. MYSQL常用命令集合

    1.导出整个数据库 mysqldump -u 用户名 -p --default-character-set=latin1 数据库名 > 导出的文件名(数据库默认编码是latin1) mysqld ...

  5. MySQL重置密码与远程连接权限问题

    如果mysql没有密码,或者密码设置为空的时候可以通过在用管理员身份打开cmd,然后在里面输入mysqladmin -u root password 123456  这个地方的密码是明文密码. 如果忘 ...

  6. Oracle“不等于号”与Nulls的情况(转)

    今天突然才发现,Oracle中的“不等于操作符”是忽略null的. 比如,查询comm不等于的500的记录,我会理所当然地使用where comm != 500 预想会返回包含null的不等于500的 ...

  7. So many interfaces!

    http://stackoverflow.com/questions/4817369/why-does-does-it-really-listt-implement-all-these-interfa ...

  8. [BZOJ2173]整数的lqp拆分

    [题目描述] lqp在为出题而烦恼,他完全没有头绪,好烦啊… 他首先想到了整数拆分.整数拆分是个很有趣的问题.给你一个正整数N,对于N的一个整数拆分就是满足任意m>0,a1 ,a2 ,a3…am ...

  9. 【转】Xcode 7 真机调试详细步骤

    原文网址:http://www.jianshu.com/p/fa5f90b61ad6 文/ldjhust(简书作者)原文链接:http://www.jianshu.com/p/fa5f90b61ad6 ...

  10. Delphi 6 Web Services初步评估之二(转)

    Delphi 6 Web Services初步评估之二(转)   ★ 测试环境:CPU:PIII 550内存: 256MBOS: Windows2000 Server + SP2Web Server: ...