引用是个别名。

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. 【uva10917】Walk Through the Forest (最短路)

    题目: gbn最近打算穿过一个森林,但是他比较傲娇,于是他决定只走一些特殊的道路,他打算只沿着满足如下条件的(A,B)道路走:存在一条从B出发回家的路,比所有从A出发回家的路径都短.你的任务是计算一共 ...

  2. ListView 滚动条的图标样式

    android:fastScrollEnabled="true" android:focusable="true" 在listview的xml文件中添加这两条记 ...

  3. linux 设置命令行属性,背景色,前景色等

    我的博客:www.while0.com 主要是命令setterm.

  4. 优雅的让Fragment监听返回键

    转载请注明出处:http://write.blog.csdn.net/postedit/40507387 Activity可以很容易的得到物理返回键的监听事件,而Fragment却不能.假设Fragm ...

  5. ping详解

    Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地址192.168.1.1试试”. ...

  6. append

    之前一次使用append就是插入不成功, 这次好了,可以了 原来是js和javascript不能混了.

  7. jquery-pager分页

    首先引用这三个文件 <script src="../../Scripts/jquery-1.4.4.min.js" type="text/javascript&qu ...

  8. 整数区间及区间集合(C#实现)

    /// <summary> /// 整数区间类 /// </summary> private class Interval { , _end = ; public int St ...

  9. Python切割nginx日志_小组_ThinkSAAS

    Python切割nginx日志_小组_ThinkSAAS Python切割nginx日志

  10. Spark 中的join方式(pySpark)

    spark基础知识请参考spark官网:http://spark.apache.org/docs/1.2.1/quick-start.html 无论是mapreduce还是spark ,分布式框架的性 ...