1. C语言中的const
(1)const修饰的变量是只读的,使得变量具有只读属性,但本质还是变量。所以不是真正的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。
(2)const修饰的局部变量在栈上分配空间,全局变量在只读存储区分配空间
(3)const只在编译期有用,在运行期无用
【编程实验】C/C++中的const
#include <stdio.h> int main()
{
const int c = ; //C语言中会为变量c分配内存
int* p = (int*)&c; //C++中遇到&才为c分配内存 printf("Begin...\n"); *p = ; //内存中的值己被改为5. printf("c = %d\n", c);//C语言会输出内存中的5.
//C++中会从符号表(而不是内存)中取值
//所以为0. printf("End...\n");
return ;
}
2. C++中的const
(1)C++在C的基础上对const进行了优先处理,当碰见const声明时在符号表中放入常量。
(2)编译过程中若发现使用常量,则直接以符号表中的值替换。
(3)编译过程中若发现对const常量使用了extern或&操作符,则会给对应的常量分配存储空间。注意,C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。
3. 对比C/C++中的const
C语言 |
C++ |
|
本质 |
只读变量 |
常量 |
分配内存 |
会分配 |
当使用&操作符对const常量取地址时分配 当const常量为全局,并且需要在其它文件中使用时会分配内存 |
4. C++中的const与宏的区别
C++中的const |
宏 |
|
定义 |
const int c = 5; |
#define c 5 |
处理方式 |
由编译器处理,编译器会进行类型检查和作用域检查 |
由预处理器处理,只是简单的文本替换 |
【编程实验】const与宏
#include <stdio.h> void f()
{
//宏由预编译处理,其后面的宏起作用
#define a 3 const int b = ;//作用域仅限于f函数
} void g()
{
printf("a = %d\n", a); //合法,只要是宏定义之后都可以使用 //printf("b = %d\n", b); //非法b的作用域仅限于f函数
} int main()
{
const int A = ;
const int B = ;
int array[A + B] = {};//C++中合法,因为它认为A、B都是常量。
//而C语言的const本质还是变量,数组大小只能是常量 int i = ; for(i=;i<(A + B); i++)
{
printf("array[%d] = %d\n", i, array[i]);
} f();
g(); return ;
}
5. 小结
(1)与C语言不同,C++中的const不是只读变量
(2)C++中的const是一个真正意义上的常量
(3)C++编译器可能会为const常量分配空间
(4)C++完全兼容C语言中的const常量的语法特性
第3课 进化后的 const分析的更多相关文章
-
第3课 进化后的const分析
C语言中的const const修饰的变量是只读的,本质还是变量 const修饰的局部变量在栈上分配空间(改变这个空间的值,这个变量就会改变) const修饰的全局变量在只读存储区分配空间 const ...
-
进化后的const分析
C语言中的const const修饰的变量是只读的,本质还是变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在只读存储区分配空间 const只在编译期有用,在运行期无用 注意:c ...
-
C++解析(2):进化后的 const 分析
0.目录 1.C语言中的const 2.C++中的const 3.对比 3.1 C语言与C++中的const 3.2 C++中的const与宏定义 4.小结 1.C语言中的const const修饰的 ...
-
第3课.进化后的const
1.c语言中 const修饰的变量是只读的,本质上还是变量 const修饰的局部变量在栈上分配空间(因为在栈上分配空间,所以我们可以通过改变这个空间的值.间接去改变这个变量.) const修饰的全局变 ...
-
C++ 成员函数前和函数后加const修饰符区别
博客转载自: https://www.iteblog.com/archives/214.html 分析以下一段程序,阐述成员函数后缀const 和 成员函数前const 的作用 #include< ...
-
[阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本
[阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 目录 [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 0x00 摘要 0x01 背景 1.1 代码进化 1.2 Deep ...
-
[Reprint]C++函数前和函数后加const修饰符区别
c++中关于const的用法有很多,const既可以修饰变量,也可以函数,不同的环境下,是有不同的含义.今天来讲讲const加在函数前和函数后面的区别.比如: 01 #include<iostr ...
-
C++函数前和函数后加const修饰符区别
class Test(){ public: Test(){} const int foo(int a); const int foo(int a) const; }; 一.概念 当const在函数名前 ...
-
C++类的成员函数的形参列表后面的const
看到(C++ Primer)类的成员函数这里,突然对成员函数形参列表后面的const感到迷惑. 因为书中开始说是修饰隐含形参this的,然后又说是声明该函数是只读的. 大为不解! 翻资料.找人讨论.. ...
随机推荐
-
基于Adobe Flash平台的3D页游技术剖析
写在前面 从黑暗之光,佛本是道,大战神的有插件3D页游.再到如今的魔龙之戒. 足以证明,3D无插件正在引领页游技术的潮流. 目前,要做到3D引擎,有以下几个选择. 说到这里,我们发现.这些都不重要. ...
-
干货——myeclipse快捷键
好了废话不多说.先上快捷键快捷键 alt alt+ 返回操作记录的上一步 alt+ 返回操作记录的下一步 alt+shift+o 同一 ...
-
UML类图画法及其之间的几种关系
最近做重构项目,需要画一下类图,发现类图的画法及其之间的几种关系已经淡忘了很多,所以整理总结一下,有问题的地方大家可以一起讨论下. 文章目录如下: 类图画法 类之间的几种关系:泛化(Generaliz ...
-
移动H5页面,keyup事件不好使用处理解决
1.mouse事件换成touch,pointer事件,keyup换成textInput事件
-
理解WebKit和Chromium: 硬件加速之RenderLayer树到合成树
转载请注明原文地址:http://blog.csdn.net/milado_nju ## 概述 在前面的章节中,笔者介绍了WebKit渲染引擎是如何有HTML网页构建DOM树.RenderObject ...
-
(转)Spring Boot(九):定时任务
http://www.ityouknow.com/springboot/2016/12/02/spring-boot-scheduler.html 在我们开发项目过程中,经常需要定时任务来帮助我们来做 ...
-
[BUAA2017软工]第1次个人项目 数独
[BUAA软工]第1次作业 个人项目 数独 一.项目地址 github地址:https://github.com/BuaaAlen/sudoku 二.PSP表格 三.解题思路描述 在拿到这个题目时,我 ...
-
Windows 使用 StarWind 创建的 Oracle RAC环境 异常关机之后的处理过程
创建好了 虚拟机之后发现 偶尔会出现 蓝屏重启的现象, 这个时候 需要进行 异常处理 确定虚拟机已经开机之后 1. 打开iscsi的连接设备, 确认 iscsi的正常连接到虚拟机的 存储设备 注意 r ...
-
关闭windows 7的自动休眠功能
powercfg -h off powercfg -h on https://www.tulaoshi.com/n/20160401/2075397.html powercfg -h on 该文章&l ...
-
4. CMake 系列 - 项目添加编译选项
目录 1. 项目目录结构 2. 相关代码 2.1 add 模块 2.2 sub 模块 2.3 example 模块 2.4 顶层 CMakeLists.txt 3. 配置&编译 1. 项目目录 ...