zoukankan      html  css  js  c++  java
  • 关于c++中的引用

    引用是个别名。

    1、引用是否占用空间

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

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

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

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

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

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

    看如下例子:

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

    以上都是合法的代码。

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

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

    上述代码等同于:

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

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

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

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

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

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

          ......

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

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

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

  • 相关阅读:
    nrm安装与配置(nrm管理npm源)
    Mac启动MongoDB报错:exception in initAndListen: NonExistentPath: Data directory /data/db not found., terminating
    基本类型(例如:int)数组和ArrayList之间的转化
    sqlite3--sqlite3_prepare
    fgets
    strdup
    openssl-EVP_md5()
    FIPS--Federal Information Processing Standards
    pthread_mutexattr_gettype、pthread_mutexattr_settype、pthread_mutexattr_destroy、pthread_mutexattr_init!
    gethostname&&getdomainname
  • 原文地址:https://www.cnblogs.com/xiaoerhei/p/3745497.html
Copyright © 2011-2022 走看看