c语言const和c++const
1.常量
常量是指值不能被改变的量,又叫做字面值
1.1常量分类
1)字符常量:'a', 'A', '*'。
2)字符串常量:"helloworld","ilovechina","12345"
3)整型常量: 25,10,012,0x0a,0b00001010
4)浮点型常量: 3.14,123.456, 3.0E-23
2.c语言的const
1)c语言用关键字const将变量修饰成只读变量,还是属于变量范畴
2)const变量仍然是变量,只是具有只读特性,所以不能用来定义数组维度
3)const变量一旦创建后其值就不能被改变了,所以const变量需要在定义时初始化
3.c++的const
3.1修饰变量
1)const修饰的变量必须初始化
2)c++对const进行了优化,const修饰的变量的可以成为常量表达式,在c++中会进行常量折叠(在编译阶段出现该变量的地方会进行值替换),正因为这个优化,所以在这种情况下c++中const变量成为了常量,可以用它来定义数组维度
3)const变量的内存分配问题:
情况1:const修饰的全局变量存放在.rodata段中
情况2:对于const修饰的局部变量,当定义const局部变量为常量表达式时(如:const a=5),此时不为它分配内存,而是放入符号表中,但当第一次对它做地址相关的操作(如:取它的地址&a 或 用它给别的变量赋值int b=a)时,此时才会对a分配内存(在DEBUG模式下面的反汇编,编译器生成汇编代码为了能更好的调试,所以无论如何都会分配空间给const常量,但是如果你打开编译器的O2优化选项的话,就不会分配空间了)
3.2c++建议使用 const 全局变量来替换一般常量的宏定义

3.3修饰函数类的成员函数
3.4修饰指针/引用
4.c++常量折叠
4.1概念
c++中,如果const变量的值是常量表达式,那么在编译阶段出现该变量的地方会进行值替换
4.2注意
1)在对这种变量进行取地址的操作(&)时,不发生常量折叠
2)关键字volatile可屏蔽常量折叠
c语言const和c++const的更多相关文章
- C语言关键字 - 铁布衫:const 转载
const 描述:相传C世界中出现了一件极品装备const,它能的出现,让天下所有的刺客,黑客都失业了,在它的保护下,所有的变量都可以完好无损. 作用:const是constant的简写,表示海枯石栏 ...
- C语言之extern、const、volatile
extern: extern修饰变量,声明该变量为外部文件的全局变量.若使用外部全局变量,必须用extern声明. extern修饰函数,声明该函数为外部函数.extern修饰的函数形参必须与原函数一 ...
- C/C++对bool operator < (const p &a)const的认识,运算符重载详解(杂谈)
下面来进行这段代码的分析: struct node { //定义一个结构体node(节点) int x; int y; int len; //node中有3个成员变量x,y,l ...
- C++中加const与不加const的区别
“常量”与“只读变量”的区别. 常量肯定是只读的,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它. “只读变量”则是在内存中 ...
- 深入理解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种组合 ...
- static、const和static const
http://blog.csdn.net/rainkin1993/article/details/8068558 #include<iostream> using namespace st ...
- 【转】深入理解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章 变量和基本类型 附3---底层const和顶层const
和英文版的对: As we’ve seen, a pointer is an object that can point to a different object. As a result,we c ...
- 【c++基础】const、const指针、const引用
一.const常量 声明时必须同时初始化(和“引用”一样) 二.const指针 三.const引用 引用本身和引用的对象都是const对象,可以用字面值来赋给const引用(普通引用则不行) ; co ...
- C++ static、const和static const 以及它们的初始化
转自C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. s ...
随机推荐
- 8.16 val()和html()的问题
今天在做关闭模态框重置表单时,关闭模态框后输入框里的值还是在,不知道怎么回事? 感谢wd啦,原来我在初始化这个输入框的时候就写错了,输入框写值的时候用的是val(),而我和上面的div一样,用的是ht ...
- ubuntu下tomcat的安装及注册成系统服务
在ubuntu下tomcat的安装有两种方式,第一种是下载二进制文件,解压安装:第二种则是使用apt-get自动下载.这里不推荐第二种方法安装,因为这种方法安装会像天女散花一样把安装的文件散落在系统的 ...
- maven工程的拆分与聚合
1.创建父工程: 首先创建maven Project: 点击next,进入下一个页面,勾选上create a simple project: 点击next,进入下一页面,在这里与创建普通maven工程 ...
- Json解析数据
Json数据解析(重点网址推荐:www.json.org code.google.com/ https://www.json.com/) 1:什么是Json? 2:Json数据格式的特点? 3 ...
- 制作根文件系统之内核如何启动init进程
start_kernel其实也是内核的一个进程,它占用了进程号0,start_kernel的内容简写如下: asmlinkage void __init start_kernel(void) //内核 ...
- c# 24种设计模式5原型模式(Prototype)
前言 原型模式其实C# Object中已经提供了一个Clone( )方法,平时很少用到,最近读Retrofit源码时候看到有这种使用方式. 定义 原型模式就是在系统clone()标记的基础上,对Clo ...
- 4.Mysql中的运算符
4.Mysql中的运算符运算符用来连接表达式.运算符包括:算术运算符.比较运算符.逻辑运算符.位运算符. 4.1 算术运算符算术运算符包括加(+).减(-).乘(*).除(/).取模(%,MOD) 5 ...
- instanceof 和 typeof
instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链 function Person(){ Person.prototype.dan ...
- http协议(一)一些基础知识
当我们在浏览器的地址栏中输入网址,然后点击回车,接着,浏览器就会呈现出我们需要的web界面,那么,这个界面是怎么产生的? web的界面是根据我们输入的URL(网址.地址),浏览器从服务器端获取对应的文 ...
- 【原创】DOTNET动态调试破解Spoon,及MSI安装包文件替换技术
提到Spoon可能大家还会感到陌生,但是如果提及XenoCode那么研究过DOTNET的人应该都知道吧.Spoon的前身就是XenoCode,虽然没有了PostBuild这个混淆软件,但是虚拟化技术仍 ...