引用的本质分析(四)

  

,,,,,,,,我们上节讲了c++中的引用,那么我们就来看下. .注意:函数中的

,,,,,,,,下来我们来看看交换函数的实现对比,如下

void 交换(int *,,, int *, b),,,,//,指针形式的   {   ,,,int  t =, *一个;   ,,,* a =, * b;   ,,,* b =, t;   }      void 交换(int&,,, int&, b),,,,//,引用形式的   {   ,,,int  t =,,   ,,,a =, b;   ,,,b =, t;   }

,,,,,,,,那么这块就有个特殊的引用,便是const引用了。在c++中可以声明const引用,它的格式为;const引用让变量拥有只读属性。当使用常量对const引用进行初始化时,c++编译器会为常量值分配空间并将引用作为这段空间的别名。使用常量对const引用初始化后将生成一个只读变量!

,,,,,,,,下来我们以代码为例进行分析,看看引用的特殊意义,代码如下

# include  & lt; stdio.h>      void 示例()   {   ,,,printf(“例子:\ n");   ,,,,   ,,,int  a =, 3;   ,,,const  int&, b =,,   ,,,int *, p =, (int *), b;   ,,,,   ,,,//,b =, 5;   ,,,,   ,,,* p =, 5;   ,,,,   ,,,printf (“a =, % d \ n",, a);   ,,,printf (“b =, % d \ n",, b);   }      void 演示()   {   ,,,printf(“演示:\ n");   ,,,,   ,,,const  int&, c =, 1;   ,,,int *, p =, (int *)和c;   ,,,,   ,,,//,c =, 5;   ,,,,   ,,,* p =, 5;   ,,,,   ,,,printf (“c =, % d \ n",, c);   }      命令行参数个数,int 主要(int  char  * argv [])   {   ,,,的例子();   ,,,,   ,,,printf (“\ n");   ,,,,   ,,,演示();   ,,,,   ,,,return  0;   }

,,,,,,,,我们在例子函数中定义了变量,用b const引用,然后用指针p指向b。然后通过指针p改变b的值,但是这块b是const引用,所以不能直接改变b。我们看看a和b会是多少。在演示函数中,我们通过const引用c为1,并且定义指针p指向它。同样不能直接改变c,但是可以通过指针p来改变它的值,我们先来看看通过指针p改变后的值是否为5呢?看看编译结果

引用的本质分析(四)

,,,,,,,,我们看到值已经都改变了,我们再来去掉第11日和26日行的注释,看看直接改变const 引用会怎样? 引用的本质分析(四)

,,,,,,,,我们看到报的都是它们是只读变量。那么我们思考下:引用有自己的存储空间吗?我们通过程序来看看

# include  & lt; stdio.h>      struct 测试   {   ,,,char&, c;   };      命令行参数个数,int 主要(int  char  * argv [])   {   ,,,char  c =, & # 39; c # 39;;   ,,,char&, rc =, c;   ,,,test  r =, {, c };   ,,,,   ,,,printf (“sizeof (char&),=, % d \ n",, sizeof (char&));   ,,,printf (“sizeof (rc),=, % d \ n",, sizeof (rc));   ,,,,   ,,,printf (“sizeof(测试),=,% d \ n",, sizeof(测试);   ,,,printf (“sizeof(研究中心),=,% d \ n",, sizeof(研究中心));   ,,,,   ,,,return  0;   }

,,,,,,,,我们在第3行定义了一个结构体变量测试,但它里面只有一个字符类型的引用c。我们来看看这个结构体占用内存吗?编译如下

引用的本质分析(四)

,,,,,,,,我们看到引用本身只占用了一个字节,但是结构体测试占用了4个字节的内存。我们猜想它是不是跟指针有某种联系呢?其实引用在c++中的内部实现是一个<强> 强。关系如下

引用的本质分析(四)

,,,,,,,,注意:。下来我们通过一个示例代码进行说明

# include  & lt; stdio.h>      struct 不洁净的   {   ,,,char *,之前;   ,,,char&,裁判;   ,,,char *,之后;   };      命令行参数个数,int 主要(int  char *, argv [])   {   ,,,char  a =, & # 39;一个# 39;;   ,,,char&, b =,,   ,,,char  c =, & # 39; c # 39;;      ,,,TRef  r =, {,,,,,, c};      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

引用的本质分析(四)