1、C语言中的const:

  • const修饰的变量是只读的,本质还是变量
  • const修饰的局部变量在栈上分配空间
  • const修饰的全局变量在只读存储区分配空间
  • const只在编译期有用,在运行期无效
  • const不能定义真正意义上的常量

const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。const 局部变量是在栈上分配空间,可以通过指针改变这个空间里面的值。过了编译期,const变量的常量特性,只读特性就没有了,只读特性只在编译期有效,运行期根本无效。const修饰的全局变量在只读存储区分配空间,因此如果用指针去修改了const修饰的全局变量,程序就会崩溃,因为修改了程序只读存储区中内容,大部分程序都会发生崩溃。

2、C++中的const

C++在C的基础上对const进行了进化处理,具体表现在:

  • const声明时,在符号表中放入常量

  • 编译过程中发现常量直接以符号表中的值替换(常量折叠)

  • 编译过程中也可能为对应的常量分配存储空间:

    • const用在全局或者使用了static关键字说明,存放在只读数据区

      extern const int i = 10;
      static const int i = 10; // 或者修饰全局变量
      const int a =10;
      int main()
      {}
    • 局部变量中对const常量使用了&操作符,在栈区分配空间

注意:C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值

符号表是编译过程中产生的一种数据结构

#include <iostream>
#include <string>
using namespace std; const int i = 10; // 如果通过指针去改变i,就会出现段错误:尝试修改只读数据区数据
int main()
{
const int a = 5;
int *p = (int *)&a; // &a, 给a标识符分配空间了,并用p指向了该空间,可以通过*p访问这个地址,但是不能通过a来访问
*p = 10; // 不能通过指针去改变a的值
cout << a << endl;
cout << *p << endl; return 0;
}

3、与宏定义对比

C++ 中的const常量类似于宏定义

const int c = 5;
// 类似于
#define c 5

但是cosnt与宏定义的区别在于:

  • const常量是有编译器处理
  • 编译器对cosnt常量进行类型检查和作用域检查
  • 宏定义由预处理器处理,只是进行单纯的文本替换
#include <stdio.h>

void f()
{
#define a 3
const int b = 4;
} void g()
{
printf("a = %d\n", a);
// 在g函数中访问f函数中的宏定义,完全没有问题
// 在预处理的时候就进行了宏替换,对编译器来说,就是printf("a = %d\n", 3);
// 宏是没有作用域的概念 // const 定义的常量,被编译器处理,是有作用域的,不能访问b
printf("b = %d\n", b);
} int main()
{
const int A = 1;
const int B = 2;
int array[A + B] = {0};
// 如果是C语言,const修饰得到的只是具有只读特性的变量,数组的大小是由两个变量的大小决定的,两个变量相加的结果需要在运行的时候才能直到,因此编译器编译的时候不知道这个数组长度,直接报错
// C++编译,const是定义的真正意义上的常量,直接从符号表中取值,编译的时候就知道A和B的值,可以得到数组的长度,不会报错
int i = 0; for(i=0; i<(A + B); i++)
{
printf("array[%d] = %d\n", i, array[i]);
} f();
g(); return 0;
}

4、小结

与C语言不同,C++中的const不是只读变量

C++中的const是一个真正意义上的常量

C++编译器可能会为const常量分配空间

C++完全兼容C语言中const常量的语法特性

三、C++ const分析的更多相关文章

  1. mysql优化(三)–explain分析sql语句执行效率

    mysql优化(三)–explain分析sql语句执行效率 mushu 发布于 11个月前 (06-04) 分类:Mysql 阅读(651) 评论(0) Explain命令在解决数据库性能上是第一推荐 ...

  2. 对于这个函数const int func(const int& a) const声明中,三个const分别是什么意思?

    第一个const 函数的返回值类型是const. 这个const修饰没什么意义,你可以想象一下: 既然是函数的 返回值,而且是值传递的形式,是否const有什么意义.如果指针(引用)传递,怎表示返回值 ...

  3. [C++ Primer Plus] 第10章、对象和类(一)程序清单——辨析三个const

    程序清单10.1+10.2+10.3 头文件stock.h #ifndef STOCK00_H_ //先测试x是否被宏定义过 #define STOCK00_H_ //如果没有宏定义,就宏定义x并编译 ...

  4. OO前三次作业分析

    一,第一次作业分析 度量分析: 第一次的oo作业按照常理来说是不应该有这么多的圈复杂度,但是由于第一次写的时候,完全不了解java的相关知识,按照c语言的方式来写,完全的根据指导书的逻辑,先写好了正确 ...

  5. 实验三:跟踪分析Linux内核的启动过程

    实验三:跟踪分析Linux内核的启动过程 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处   <Linux内核分析>MOOC课程http://mooc.study.16 ...

  6. LwIP协议栈开发嵌入式网络的三种方法分析

    LwIP协议栈开发嵌入式网络的三种方法分析   摘要  轻量级的TCP/IP协议栈LwIP,提供了三种应用程序设计方法,且很容易被移植到多任务的操作系统中.本文结合μC/OS-II这一实时操作系统,以 ...

  7. 开始 python programming第三版案例分析

    最近研究python,打算将python programming第三版案例分析下 但是全书1600多页 比较费时 而且 介绍太多 感觉没有必要! python programming 堪称经典之作 第 ...

  8. Linux I2C设备驱动编写(三)-实例分析AM3359

    TI-AM3359 I2C适配器实例分析 I2C Spec简述 特性: 兼容飞利浦I2C 2.1版本规格 支持标准模式(100K bits/s)和快速模式(400K bits/s) 多路接收.发送模式 ...

  9. 【转】Linux I2C设备驱动编写(三)-实例分析AM3359

    原文网址:http://www.cnblogs.com/biglucky/p/4059586.html TI-AM3359 I2C适配器实例分析 I2C Spec简述 特性: 兼容飞利浦I2C 2.1 ...

随机推荐

  1. python slice 切片

    list,tuple,string,bytes对象可以进行切片处理,生成一个新的这些类的对象. 格式:li[start: stop: step] list切片: >>> li = [ ...

  2. bzoj 2435: [Noi2011]道路修建【树形dp】

    dp求size和deep,然后对每条边模拟求代价即可 #include<iostream> #include<cstdio> #include<algorithm> ...

  3. SVG动画 -- 描边动画

    代码说明:纯CSS实现,无JS <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  4. linux 读取部分文件内容

    一般我们在linux上读取文件,是用vi工具,如果是写shell 脚本时,一般式通过cat 再 使用管道来达到流的处理. 但如果文件太大,单纯的cat 可能会使用过多的内存,而且实现上还需要后续的加工 ...

  5. iperf工具学习记录

    源码下载地址:http://sourceforge.net/projects/iperf/ 编译命令: tar -zxvf iperf-2.0.5.tar.gz cd iperf-2.0.5 ./co ...

  6. WOW.js 动画使用

    有的页面在向下滚动的时候,有些元素会产生细小的动画效果.虽然动画比较小,但却能吸引你的注意.比如刚刚发布的 iPhone 6 的页面(查看).如果你希望你的页面也更加有趣,那么你可以试试 WOW.js ...

  7. Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) 题解

    真心简单的一场比赛 就是坑比较多(自己太蠢) A是一个水题 3分钟的时候过了 B也是一个比较简单的题 类似的套路见得多了 但是我当时可能比较困 想了一会才想出来 19分钟的时候过掉了 C同样很显然 性 ...

  8. AtCoder Regular Contest 081 F - Flip and Rectangles

    题目传送门:https://arc081.contest.atcoder.jp/tasks/arc081_d 题目大意: 给定一个\(n×m\)的棋盘,棋盘上有一些黑点和白点,每次你可以选择一行或一列 ...

  9. (好题)树状数组+离散化+DFS序+离线/莫队 HDOJ 4358 Boring counting

    题目传送门 题意:给你一棵树,树上的每个节点都有树值,给m个查询,问以每个点u为根的子树下有多少种权值恰好出现k次. 分析:首先要对权值离散化,然后要将树形转换为线形,配上图:.然后按照右端点从小到大 ...

  10. JS与JQ绑定事件的几种方式.

    JS与JQ绑定事件的几种方式 JS绑定事件的三种方式 直接在DOM中进行绑定 <button onclick="alert('success')" type="bu ...