一.const的基本作用

之前所讲的C++中的变量值,都是可以赋值的,如果我们想不允许对变量赋值,那么就要将变量设置为const

void testconst()
{const int c=10;c=20;
}

可见,只能对const变量进行初始化,不能对其赋值,因为const变量的值不能被改变

二.const与引用

1.可以用const来修饰一个引用,称为对const变量的引用,const变量的引用不能直接修改所绑定的对象(这个性质通常用于函数传参,使传的参数在函数中不能被改变)

void testconst()
{int i=2;const int &ri=i;ri=3;
}

也就是说,无法通过ri来修改i的值

2.因为const的变量无法修改,所以不能用一般引用与const变量进行绑定

void testconst()
{const int c=10;int &ri=c;
}

如果可以通过一般引用来绑定const的变量,那么就可以通过该引用修改const变量,与const的属性相冲突,所以,不能用一般引用与const变量进行绑定

3.一般的引用不能与字面值进行绑定,但是const变量的引用可以绑定字面值(因为有const修饰)

而且,const变量的引用不仅可以绑定字面值,还可以绑定一般的对象(允许类型不匹配)

void testconst()
{double d=1.2;const int &rc=10;const int &rc1=d;cout<<rc<<endl<<rc1<<endl;
}

正是因为const变量的引用几乎可以绑定任何对象,所以函数的参数一般都设定为const变量的引用,扩大了函数可传参数的范围

此外,由于是按引用传参,所以避免了拷贝,加快了代码的执行速度。

当执行const int &rc1=d;时,rc1并不是真正的和d绑定,而是绑定了一个临时变量,编译器会把这句代码转化成下面这样

const int tmp=d;//类型转换double to int
const int &rc1=tmp;

在这种情况下,引用绑定的是一个临时量对象而不是d本身,而是临时变量tmp。c++认为,常量引用可以绑定这个临时量,而普通引用就不能绑定这个临时量。因为c++认为,使用普通引用绑定一个对象,就是为了能通过引用对这个对象做改变。如果普通引用绑定的是一个临时量而不是对象本身,那么改变的是临时量而不是希望改变的那个对象,这种改变是无意义的。所以规定普通引用不能绑定到临时量上。

那么为什么常量引用就可以呢,因为常量是不能改变的。也就是说,不能通过常量引用去改变对象,那么绑定的是临时量还是对象都无所谓了,反正都不能做改变也就不存在改变无意义的情况。所以常量引用可以绑定临时量,也就可以绑定非常量的对象、字面值,甚至是一般表达式,并且不用必须类型一致。

4.因为引用并不是对象,所以不存在const引用(注意理解const变量的引用和const引用的区别)

void testconstreference()
{double d=1.2;int  &const rc=10;//const的引用const int &rc1=d;cout<<rc<<endl<<rc1<<endl;
}

const变量的引用与一般引用(见C++知识点——指针、引用基础)的区别

1.一般引用不能绑定字面值。但是const变量的引用就可以

2.一般引用要与绑定的数据的类型一致,但是const变量的引用是个例外

三.const与指针

1.const变量的值不能改变,所以想要存放const变量的地址,就需要使用指向const变量的指针

void testconstpointer()
{const int i=0;const int *pi=&i;cout<<pi<<endl;
}

2.所以指向const变量的指针的基本作用就是存储const变量的地址,而且const变量的指针也可以存储非常量的地址(类型要匹配),因为pi本身是变量,pi本身并不是const

void testconstpointer()
{int i=0;const int *pi=&i;cout<<pi<<endl;
}

3.const变量i的地址不能使用指向非常量的指针来存储,而且非常量的指针也不能指向常量的指针,否则可以通过指针修改const变量。

void testconstpointer()
{const int i=0;const int *pi=&i;int *p=&i;cout<<pi<<endl;
}

void testconstpointer()
{const int i=0;const int *pi=&i;int *p=&pi;cout<<pi<<endl;
}

4.因为引用不是对象,但是指针是对象,所以存在const指针

void testconstpointer()
{int i=0;const int *const pi=&i;cout<<pi<<endl;
}

const int *const pi的读法依然采用从右向左的读法

先看到红色的pi,我们知道这是一个变量,接着看到蓝色的const,我们知道他是一个const变量,然后看到绿色的*,我们知道这个是const的指针变量,看到紫色的const int我们知道这个const指针指向一个const int

因为pi用const修饰,所以pi中存储的地址值不能改变,也就是说,pi本身不能改变

void testconstpointer()
{int i=0;int j=0;const int *const pi=&i;pi=&j;cout<<pi<<endl;
}

因为pi指向const int,所以不能通过pi来改变指向的对象的值。

void testconstpointer()
{int i=0;int j=0;const int *pi=&i;*pi=10;cout<<pi<<endl;
}

通过上面的一些例子可以总结出:可以将一般变量的指针或引用转为const变量的指针或引用,但是反之不可以

参考:

《C++ Primer》

https://blog.csdn.net/Colsum/article/details/79095462

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

C++知识点3——const基础相关推荐

  1. 看c++primer知识点总结(基础部分)

    看c++primer知识点总结(基础部分) 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 看c++primer知识点总结(基础部分) 前言 一.变量和基本类型 1.声明 ...

  2. 计算机应用基础知识点.pdf,计算机应用基础教学知识点.pdf

    计算机应用基础教学知识点 <计算机应用基础> 教 学 知 识 点 I 一.课程介绍 进入21世纪以来,计算技术正在经历重大的变化和发展,计算机 的应用已经渗透到经济和社会生活的各个方面.计 ...

  3. 计算机视觉-计算机视觉知识点整理1基础篇

    一.基础知识 1.1 BatchNorm/LayerNorm/InstanceNorm/GroupNorm 基础知识点 记忆点 备注 Batch Norm 达到的效果 BatchNorm就是在深度神经 ...

  4. Java 面试知识点解析(一)——基础知识篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  5. 给Java新手的一些建议——Java知识点归纳(Java基础部分)

    写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给 ...

  6. 知识点总结(基础篇)

    知识点总结1 PEP8 规范 每一级缩进使用4个空格. 空格是首选的缩进方式. 行限制的最大字符数为79 使用下划线分隔的小写字母 类名一般使用首字母大写的约定 异常名后面加上"Error& ...

  7. java 解析tgw_给Java新手的一些建议——Java知识点归纳(Java基础部分)

    1. JVM相关(包括了各个版本的特性) 对于刚刚接触Java的人来说,JVM相关的知识不一定需要理解很深,对此里面的概念有一些简单的了解即可.不过对于一个有着3年以上Java经验的资深开发者来说,不 ...

  8. 大一计算机思维知识点,大学计算机基础教学中计算思维的培养途径

    摘要:从几个侧面思考和探究在大学计算机基础教学中培养学生计算思维的途径,提出通过整合教学内容,将不同的知识点归纳为不同的知识单元:通过实验教学,提升学生运用计算思维处理问题的能力. 关键词:计算思维: ...

  9. java程序设计基础知识点_Java编程语言基础知识的要点

    原标题:Java编程语言基础知识的要点 很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识.下面就说说Java零基础学习Java编程语言基础知识的几个要点.希望能 ...

最新文章

  1. oracle exists语句
  2. openGL 坐标系的互相转换
  3. PHP中绘制图像的一些函数总结
  4. 爱情,是我一生中最虔诚的信仰
  5. 安卓开发环境搭建(转)
  6. NS3入门--second.cc
  7. 如何提高.NET的性能 ?
  8. pyhton学习-1
  9. 保护模式下的80386及其编程02:机器状态和存储寻址
  10. 「需求广场」需求词更新明细(六)
  11. Svn分支管理的使用(三)
  12. html5怎么调用cur指针,win7鼠标指针主题包怎么用
  13. 隧道监控计算机网络系统方案,高速公路隧道监控系统解决方案
  14. 一线工程师告诉你嵌入式真实现状与发展前景
  15. 项目上线部署发布流程
  16. 为知笔记docker搭建
  17. 自动生成_一键自动生成CAD图纸目录
  18. 微信机器人_微信聊天消息记录拦截分析
  19. linux 监控报文命令 nc,linux监控命令nc用法
  20. 使用JLINK仿真器调试树莓派4

热门文章

  1. cisco 交换机镜像
  2. grails 环境找不到java_home
  3. Linux中root下目录中没有.ssh文件
  4. DAVID-GO-记录
  5. BED文件如何排序,sort按列排序
  6. matplotlib显示中文
  7. 模型可解释性-树结构可视化
  8. redis分布式锁实现思路
  9. 【UE4】二十三、UE4笔试面试题
  10. centos 7 部署 open-falcon 0.2.0