2-2 理解const
1 const
- 在引用中注意不能为常量绑定一个非常量的引用
- 在指针中区分
low-level const和top-level const
const通常用于定义常量,一经定义不许修改,且使用const必须初始化
情形一
当我们在使用某个函数时,不希望变量在函数内部被改变,则可以将形参定义为const形式
void function (const int value)
情形二
const和引用放在一起使用时要注意,常量值不可以绑定到非常量的引用上,但是非常量可以绑定到常量的引用上。
non-const -> const
const !-> non-const
非常量值绑定到常量类型的引用是因为编译器帮我们产生了一个const类型的临时变量,比如:
int i=1;
const int &value=i;
//编译器行为
const int temp=i;
const int &value=temp;
情形三
如果我们需要一个指针指向常量时,那么这个指针也必须是常量类型,否则编译器会报错。另外在C++ Primer中我们可以看到low-level const和top-level const这样的概念,通过一个例子来理解
const int value=123;//top-level
const int *pvalue=&value;//low-level
*pvalue=456; //错误
const int value=123;
const int *pvalue=&value;
int vol_value=456;
pvalue=&vol_value;//正确
这里注意在第一段的程序里const修饰的并不是pvalue,而是外面的int部分,这里应该理解为一个指针pvalue指向const int类型,即它的指向类型不能变。由于其所指地址是常量属性,常量不允许被修改,所以会报错,但是指针pvalue还是可以改变所指方向的。
那么如果我们不希望指向常量的指针被修改,那么就应该让它成为top-level const,它所修饰的就是指针这个对象了,即如下所示
const int *const pvalue
区分top-level还是low-level并不是说看const在里面还是在外面,而是看他所修饰的是什么。对于指针这样的复合类型来说,如果修饰的是一个对象,那就是top-level,如果修饰的是基本类型,那就是low-level了
2-2 理解const的更多相关文章
- 【转】深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
一.可能的组合: (1)const char*p (2)char const*p (3)char *const p(4)const char **p (5)char const**p (6)char ...
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
由于没有const*运算,const实际上修饰的是前面的char*,但不能在定义时转换写成 const(char *)*p,因为在定义是"()"是表示函数. 三.深入理解7种组合 ...
- 理解-const
c++ 中const和c中define的区别 (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不 ...
- 我所理解的readonly和const
最近要给学校软件小组新成员讲几次课,所以把很多以前懒得学习的和模糊不清的知识点,重新学习了一下. MSDN是这样解释的: readonly 关键字与 const 关键字不同. const 字段只能在该 ...
- 深入理解C++中的Const,Mutable以及Volatile
我一直认为const表示一个常量,常量就是一个无法被修改的值,但是没有深入理解const的实现,甚至不知道mutable和volatile的存在,最近在书中看到了这一部分的知识,所以本文将详细解析这几 ...
- const的理解、const指针、指向const的指针
1.const 的理解 const 是C语言的一个关键字,需要注意的是,const 关键字是把变量变为一个只读的变量(也就是不可以作为左值),绝对不是将这个变量变为常量.也就是说经过const 修饰的 ...
- Const关键字
const const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性.另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程 ...
- C#中Const和Readonly的区别
const 的概念就是一个包含不能修改的值的变量.常数表达式是在编译时可被完全计算的表达式.因此不能从一个变量中提取的值来初始化常量.如果 const int a = b+1;b是一个变量,显然不能再 ...
- c++ static及const(开发者在线)
static 是c++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因.作用谈起,全面分析static 修饰符的实质. static 的两大作用: 一. ...
- const 与指针
深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p ...
随机推荐
- pgsql表结构复制
CREATE TABLE pavement_damage_dtl_temp(like pavement_damage_dtl); 搜索 复制
- 谈谈 Redis 的过期策略
在日常开发中,我们使用 Redis 存储 key 时通常会设置一个过期时间,但是 Redis 是怎么删除过期的 key,而且 Redis 是单线程的,删除 key 会不会造成阻塞.要搞清楚这些,就要了 ...
- holiday11
holiday11--linux basis From today I will write my note in English ,hope I will stick to it. user and ...
- 夜神模拟器连接不上adb的解决办法
1.夜神模拟器连接不上adb的解决办法 转自 (https://www.jianshu.com/p/6041e64518a8) 最近给模拟器升级了版本,用了一段时间后,突然发现通过adb device ...
- 训练题——DS18B20部分
Author:Cherry_Ywj 0. 前言 本文档以 DS18B20 为例,主要介绍如何针对一种传感器编写相应的驱动库,驱动是单片机开发中难度较大的一环.从看别人代码并对照 datasheet 开 ...
- 随机生成四则运算表达式【Unity】
根据自己项目需求调整代码中表达式的公共方法 using System.Collections; using System.Collections.Generic; using System; usin ...
- iOS学习十一之步进控制器UIStepper
步进控制器也就是进行离散式数据调节的常用视图控件. 在viewDidLoad()方法中加入下面的方法,即可完成基本功能. override func viewDidLoad() { super.vie ...
- EBI数据库下载数据
EBI网址链接: https://www.ebi.ac.uk 方法:直接从ncbi上面找到想要下载数据的SRR号然后去EBI里面直接搜索即可得到. 底部就是想要下载的fastq文件了: 然后右键复制链 ...
- Call API URL连接拼参数的方法
void TestNTFD() { try { try { ...
- STL练习-简单计算器
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔.没有非 ...