const、define 和 static 的区别
define、const
在 C++ 中,const 和 define 都可以用来定义常量。但是这二者之间有很大的区别:
define 的作用
用 define 定义的常量是没有 类型 的,编译器只是把所定义的常量值和这个常量的名字联系起来,编译器在编译的过程中只是把 常量名替换成对应的常量值,所有用到的地方都拷贝替换。
const 作用
使用 const 定义的常量是 有类型的,这个值存放在了 内存的静态区域中。
具体来说,二者具有以下这些方面的区别:
- 是否能用指针
用 define 定义的常量是不能用指针去指向该值的,因为只是简单的替换
const 定义的常量是可以使用指针去指向这个值的地址的
是否能定义函数
用 define 可以定义一些简单的函数,但是 const 不行编译器处理
define 预处理阶段替换
const 编译阶段替换
类型检查
define 不检查类型
const 检查变量类型
内存空间
define 定义的常量不占用内存空间
const 定义的常量占用静态区域的存储空间,而且只占用一个拷贝
其他
在编译的时候,编译器通常不为const变量分配存储空间,而是保存在了符号表中,可以节省内存,这使得它成为了编译期间的常量,没有了频繁的读写内存的操作,效率很高
作用范围
define 宏定义的作用范围仅在当前的文件中
const 定义的作用范围也仅仅在当前文件中,当不同的文件中出现了同名的 const 变量的时候,相当于定义了不同的变量,同时如果想在多个文件之间共享 const 变量,必须在变量定义之前添加 extern 关键字
关于 const 的一些特性
在C++ 中只使用 const 常量而不使用宏常量
const 在类中的作用
如果想在类中共享一个常量,想当然的会使用 const 常量,但是这是不对的,因为 const 常量只在对象的生存期内是常量,但是对于整个类是可变的,因为一个类可以创建多个对象,不同的对象 const 成员的值可以不同。不能再类声明中初始化 const 数据成员,const 成员变量的初始化只能在构造函数过程中
static
static 静态变量的作用范围只在一个文件内,程序开始的时候分配空间,程序结束的时候释放空间,默认初始化的值为 0,使用过程中可以对 静态变量的值进行修改,静态变量和静态函数只有本文件内的代码才能看见它,它的名字在其他文件中不可见。
- 在函数内部声明 static 变量,static 变量可以当作对象间的一种通信机制
如果一个局部变量被声明为静态变量,那么将只有唯一的一个静态分配的对象,它被用于在该函数的所有调用中表示这个变量。这个对象在第一次执行它所在的线程时到达它的定义时初始化。当同时编译多个文件的时候,所有未加 static 的全局变量和函数都具有全局可见性,如果加了 static,那么就会对其他文件隐藏。
- 局部静态对象
对于局部静态对象,构造函数是在控制线程第一次通过该对象的定义时调用。在程序结束时,局部静态对象的析构函数将按照他们被构造的相反顺序逐一调用,没有规定确切时间。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。
- 静态成员和静态成员函数
如果一个变量是类的一部分,但却不是该类的各个对象的一部分,它就被成为是一个static静态成员。一个static成员只有唯一的一份副本,而不像常规的非static成员那样在每个对象里各有一份副本。同理,一个需要访问类成员,而不需要针对特定对象去调用的函数,也被称为一个static成员函数。类的静态成员函数只能访问类的静态成员(变量或函数)。 static的第三个作用是默认初始化为0.其实全局变量也具备这一属性,因为全局变量也存储在静态数据区.
const、define 和 static 的区别的更多相关文章
- const define 定义常量的区别
1.用const定义常量在编译的时候,提供了类型安全检查,而define 只是简单地进行字符串的替换 2.const定义的常量,会分配相应的内存空间.而define没有分配空间,只是在程序中与处理的时 ...
- const define static extern
const const意味着"只读",欲阻止一个变量被改变,可以使用const关键字 const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p) define #define ...
- C# 总结const、 readonly、 static三者区别:
总结const. readonly. static三者区别: (有人问我,看似简单,我也没能立刻回答出来,总结一下,分享一下.) const:静态常量,也称编译时常量(compile-time con ...
- c++中typedef、define、const、inline之间的区别
1.typedef和#define的区别 typedef int* pInt; , b = ; const pInt p1 = &a; //p1是常量指针 pInt const p2 = &a ...
- C++ —— 非类中使用const定义常量的初始化,以及#define和typedef的区别
总结一下在非类中使用const关键字定义常量时的初始化问题,亲测VS2015.顺便记录#define宏和typedef的区别. 1 首先对const声明的常量的初始化做简单小结: , w2 = , w ...
- C# const和static readonly区别
[转]C# const和static readonly区别 以前只是知道Const和static readonlyd的区别在于const的值是在编译期间确定的,而static readonly是在运行 ...
- typedef和#define的用法与区别
typedef和#define的用法与区别 typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程 ...
- 【转】typedef和#define的用法与区别
typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: ...
- (转)typedef和#define的用法与区别
typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: ...
随机推荐
- Codeforces1249E By Elevator or Stairs?
题意 给定整数c和数组a,b,\(a_i\)表示通过爬楼梯的方法从第\(i\)层到\(i+1\)层需要的时间,\(b_i\)表示通过坐电梯的方法从第\(i\)层到\(i+1\)层需要的时间,坐电梯前需 ...
- SSM整合+WebUpload使用(spring+springmvc+mybatis+maven)
SSM框架整合以及webupload的集成与使用 在项目中最近用到了webupload.js,也方方面面遇到了不少问题,比如上传文件前对表单参数校验,当校验失败不予提交,及在文件上传成功后,选择同 ...
- 小程序开发-微信小程序开发入门
分享一个微信小程序开发的基本流程,仅供参考. 第一步:注册微信小程序公众号,注册成功后,登录微信公众号管理后台,等待下一步操作. 第二步:进入微信小程序的后台后,下载微信内置的微信小程序开发者工具,以 ...
- KMP记录
例题:luogu P3375 [模板]KMP字符串匹配 知识点:1.KMP模板,熟悉KMP 2.理解KMP过程:失配时,是从后缀转向前缀.即失配时,匹配串是从尾转到头继续匹配,被匹配串不改变. 3.注 ...
- Java自定义异常的用法
package day162020072701.day1601; /** * @author liuwenlong * @create 2020-07-27 09:25:44 */ @Suppress ...
- 理解Clip Path
http://www.w3cplus.com/css3/using-making-sense-of-clip-path.html http://www.cnblogs.com/coco1s/p/602 ...
- jmeter远程调用
jmeter版本相同 JDK版本1.7以上 脚本文件在所有机器上的路径都一致 修改远程机器jmeter bin目录下的jmeter.properties文件配置:server_port=1001 多个 ...
- shell进行微信报警的简单应用
一.企业微信注册地址: https://work.weixin.qq.com/?from=openApi二.请求格式 1.获取token的方法 curl -s 'https://qyapi.weixi ...
- oracle之三RMAN概述
RMAN概述 6.1 rman的定义和功能: 1) Recovery Manager 2)建立备份和恢复的server process,在oracle server上做备份和恢复 3)rman 备份d ...
- 一次MySQL索引失效引发的思考
最近公司做了一个千万数量级的项目,由于要求性能比较高,每一个相对慢的查询都需要优化,项目经理是一个比较有经验的开发人员,基本上遇到问题都会先自行处理:或自己分析原因或网络寻求帮助. 但是项目平稳运行一 ...