1 const

  • 在引用中注意不能为常量绑定一个非常量的引用
  • 在指针中区分low-level consttop-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 consttop-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的更多相关文章

  1. 【转】深入理解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 ...

  2. 深入理解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种组合 ...

  3. 理解-const

    c++ 中const和c中define的区别 (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不 ...

  4. 我所理解的readonly和const

    最近要给学校软件小组新成员讲几次课,所以把很多以前懒得学习的和模糊不清的知识点,重新学习了一下. MSDN是这样解释的: readonly 关键字与 const 关键字不同. const 字段只能在该 ...

  5. 深入理解C++中的Const,Mutable以及Volatile

    我一直认为const表示一个常量,常量就是一个无法被修改的值,但是没有深入理解const的实现,甚至不知道mutable和volatile的存在,最近在书中看到了这一部分的知识,所以本文将详细解析这几 ...

  6. const的理解、const指针、指向const的指针

    1.const 的理解 const 是C语言的一个关键字,需要注意的是,const 关键字是把变量变为一个只读的变量(也就是不可以作为左值),绝对不是将这个变量变为常量.也就是说经过const 修饰的 ...

  7. Const关键字

    const const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性.另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程 ...

  8. C#中Const和Readonly的区别

    const 的概念就是一个包含不能修改的值的变量.常数表达式是在编译时可被完全计算的表达式.因此不能从一个变量中提取的值来初始化常量.如果 const int a = b+1;b是一个变量,显然不能再 ...

  9. c++ static及const(开发者在线)

    static 是c++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因.作用谈起,全面分析static 修饰符的实质. static 的两大作用: 一. ...

  10. const 与指针

    深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p ...

随机推荐

  1. pgsql表结构复制

    CREATE TABLE pavement_damage_dtl_temp(like pavement_damage_dtl); 搜索 复制

  2. 谈谈 Redis 的过期策略

    在日常开发中,我们使用 Redis 存储 key 时通常会设置一个过期时间,但是 Redis 是怎么删除过期的 key,而且 Redis 是单线程的,删除 key 会不会造成阻塞.要搞清楚这些,就要了 ...

  3. holiday11

    holiday11--linux basis From today I will write my note in English ,hope I will stick to it. user and ...

  4. 夜神模拟器连接不上adb的解决办法

    1.夜神模拟器连接不上adb的解决办法 转自 (https://www.jianshu.com/p/6041e64518a8) 最近给模拟器升级了版本,用了一段时间后,突然发现通过adb device ...

  5. 训练题——DS18B20部分

    Author:Cherry_Ywj 0. 前言 本文档以 DS18B20 为例,主要介绍如何针对一种传感器编写相应的驱动库,驱动是单片机开发中难度较大的一环.从看别人代码并对照 datasheet 开 ...

  6. 随机生成四则运算表达式【Unity】

    根据自己项目需求调整代码中表达式的公共方法 using System.Collections; using System.Collections.Generic; using System; usin ...

  7. iOS学习十一之步进控制器UIStepper

    步进控制器也就是进行离散式数据调节的常用视图控件. 在viewDidLoad()方法中加入下面的方法,即可完成基本功能. override func viewDidLoad() { super.vie ...

  8. EBI数据库下载数据

    EBI网址链接: https://www.ebi.ac.uk 方法:直接从ncbi上面找到想要下载数据的SRR号然后去EBI里面直接搜索即可得到. 底部就是想要下载的fastq文件了: 然后右键复制链 ...

  9. Call API URL连接拼参数的方法

    void TestNTFD()        {            try            {                try                {             ...

  10. STL练习-简单计算器

    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔.没有非 ...