引用的意义

  • 引用作为变量别名而存在,因此在一些场合可以代替指针
  • 引用相对于指针来说具有更好的可读性和实用性
  • swap函数的实现对比:

void swap(int* a, int* b)

{

int t = *a;

*a = *b;

*b = t;

}

void swap_yinyong(int& a,int& b)

{

int t = a;

a = b;

b = t;       

}

int main()

{

int a = 1;

int b = 2;

printf("a = %d,b = %d\n",a,b);

swap(&a,&b);

printf("指针版本:a = %d, b = %d\n",a,b);

swap_yinyong(a,b);

printf("引用版本:a = %d, b = %d\n",a,b);

return 0;

}

特殊的引用:const引用

  • 在C++中可以声明const引用

Const Type& name = val;

Const 引用让变量拥有只读属性

int main()

{

int a = 1;

const int& b = a;

int *p = (int*)&b;

//b = 5; 编译报错,显示不能对只读变量赋值

*p = 5; //要想改变只读变量,可以对他的指针进行操作

printf("a = %d\n",a);

return 0;

}

  • 当使用常量对const引用进行初始化时,C++编译器会为常量分配空间并将引用名作为这段空间的别名

int main()

{

const int& b = 1;

int *p = (int*)&b;

*p = 5; //要想改变只读变量,可以对他的指针进行操作

printf("a = %d\n",b);

return 0;

}

使用常量对const引用初始化后将生成一个只读变量

引用在C++中的内部实现是一个指针常量

  • 因此引用占用的内存空间与指针相同(一般是四个字节)
  • 从使用的角度,引用只是一个别名,C++为了实用性而隐藏了引用的存储空间这一细节

struct Tref

{

char& c;       

};

int main()

{

char c = 'c';

char& rc = c;       

Tref ref = { c };

printf("sizeof(char&)%d\n",sizeof(char&));       

printf("sizeof(rc)%d\n",sizeof(rc));

printf("sizeof(ref.c)%d\n",sizeof(ref.c));

printf("sizeof(Tref)%d\n",sizeof(Tref));

return 0;

}

struct Tref

{

char* before;

char& ref;

char* after;       

};

int main()

{

char a = 'a';

char b = 'b';       

char c = 'c';

Tref r = {&a,b,&c};

printf("sizeof(r)%d\n",sizeof(r));

printf("sizeof(Tref.before)%d\n",sizeof(r.before));

printf("sizeof(Tref.after)%d\n",sizeof(r.after));

printf("&r.before=%p\n",&r.before);

printf("&r.after= %p\n",&r.after);

return 0;

}

引用的意义

  • C++中的引用大多数情况下能够代替指针
  • 功能性:可以满足多数需要使用指针的场合
  • 安全性:可以避开由于指针操作不当而带来的内存错误
  • 操作性:简单易用,又不失功能强大

小结:

  • 引用作为变量别名而存在旨在代替指针
  • const引用可以使得变量具有只读属性
  • 引用的最终本质为为指针
  • 引用可以尽可能的避开内存错误

C++中引用的本质分析的更多相关文章

  1. C++中引用的本质

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

  2. C++中引用的本质是什么?

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

  3. c语言中函数调用的本质从汇编角度分析

    今天下午写篇博客吧,分析分析c语言中函数调用的本质,首先我们知道c语言中函数的本质就是一段代码,但是给这段代码起了一个名字,这个名字就是他的的这段代码的开始地址 这也是函数名的本质,其实也就是汇编中的 ...

  4. iOS中引用计数内存管理机制分析

    在 iOS 中引用计数是内存的管理方式,虽然在 iOS5 版本中,已经支持了自动引用计数管理模式,但理解它的运行方式有助于我们了解程序的运行原理,有助于 debug 程序. 操作系统的内存管理分成堆和 ...

  5. flask中路由的本质源码分析

    flask中url的本质: 吧url和视图函数封装到一个Rule对象里面去了,并且吧这个对象添加到url_map中 Rule={"url":'/index','method':'i ...

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

    今天碰到了在XML中应用以内部类形式定义的自定义view,结果遇到了一些坑.虽然通过看了一些前辈写的文章解决了这个问题,但是我看到的几篇都没有完整说清楚why,于是决定做这个总结. 使用自定义内部类v ...

  7. C++中引用和指针详解

    先来分析指针这个东东: 从概念上讲,指针本质上就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 上面的图表示了程序运行时变量的值 ...

  8. C++解析(4):引用的本质

    0.目录 1.引用的意义 2.特殊的引用 3.引用的本质 4.函数返回引用 5.小结 1.引用的意义 引用作为变量別名而存在,因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 注 ...

  9. C++ 类的多态五(多态的语法本质分析)

    //多态的语法本质分析 #include<iostream> using namespace std; /* 三种易混淆的多态场景 */ class Point{ public: Poin ...

随机推荐

  1. simotion连接 V90 1FL6 增量型电机,报警20025 编码器细分设置

    V90 1FL6 增量型电机 The configured fine resolution for Gx_XIST1 (Encoder_N.absEncoder.absResolutionMultip ...

  2. June 24th 2017 Week 25th Saturday

    Who is able to be egotistical needs to be strong too. 有本事任性的人,也要有本事坚强. What is egotistical? Is it th ...

  3. 贝叶斯网络(Bayesian network))简介(PRML第8.1节总结)概率图模型(Graphical models)

    转:http://www.cnblogs.com/Dzhouqi/p/3204353.html 部分图为手写,由于本人字很丑,望见谅,只是想把PRML书的一些部分总结出来,给有需要的人看,希望能帮到一 ...

  4. UVa 10820 - Send a Table(欧拉函数)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. AtCoder Grand Contest

    一句话题解 QwQ主要是因为这篇文章写的有点长……有时候要找某一个题可能不是很好找,所以写了这个东西. 具体的题意.题解和代码可以再往下翻._(:з」∠)_ AGC 001 C:枚举中点/中边. D: ...

  6. 本地测试时修改localhost为自己网站的域名的方法(转载)

    做网站的,在本地测试时,所用的地址基本上都是localhost 或者直接用IP地址:127.0.0.1 如果仅仅是用来测试网站内部的程序代码之类的当然没问题,但是如果我们还要测试网站上添加的广告或者统 ...

  7. 优化器,sgd,adam等

    https://zhuanlan.zhihu.com/p/32230623 首先定义:待优化参数:  ,目标函数:  ,初始学习率 . 而后,开始进行迭代优化.在每个epoch  : 计算目标函数关于 ...

  8. Windows 下制作CentOS7安装U盘

    本文属于另类的U盘制作方法(更多U盘安装见U盘安装CentOS ),如何安装CentOS,请参考<安装指南> 以下列出了,完整的制作步骤: 1.下载安装镜像 选择一个合适的镜像网站,比如网 ...

  9. php面试重要知识点,面试题

    1.什么是引用变量,用什么符号定义引用变量? 概念:用不同的名称引用同一个变量的内容:用&符号定义. 例如: $a = range(0,100); $b = &$a; $b = ran ...

  10. [转]JOGL安装

    本章介绍了设置环境以使用JOGL使用不同的集成开发环境(IDE),在您的系统上. 安装JOGL 对于JOGL安装,需要有以下系统要求: 系统要求 第一个要求是要在机器上安装Java Developme ...