在 C++ 中,const 和 define 均可以用来定义常量。可是这两者之间有很大的区别:函数
define 的做用线程
用 define 定义的常量是没有 类型 的,编译器只是把所定义的常量值和这个常量的名字联系起来,编译器在编译的过程当中只是把 常量名替换成对应的常量值,全部用到的地方都拷贝替换。指针
const 做用对象
使用 const 定义的常量是 有类型的,这个值存放在了 内存的静态区域中。内存
具体来讲,两者具备如下这些方面的区别:编译器
const 定义的常量是能够使用指针去指向这个值的地址的编译
是否能定义函数
用 define 能够定义一些简单的函数,可是 const 不行class
编译器处理效率
define 预处理阶段替换变量
const 编译阶段替换
类型检查
define 不检查类型
const 检查变量类型
内存空间
define 定义的常量不占用内存空间
const 定义的常量占用静态区域的存储空间,并且只占用一个拷贝
其余
在编译的时候,编译器一般不为const变量分配存储空间,而是保存在了符号表中,能够节省内存,这使得它成为了编译期间的常量,没有了频繁的读写内存的操做,效率很高
做用范围
define 宏定义的做用范围仅在当前的文件中
const 定义的做用范围也仅仅在当前文件中,当不一样的文件中出现了同名的 const 变量的时候,至关于定义了不一样的变量,同时若是想在多个文件之间共享 const 变量,必须在变量定义以前添加 extern 关键字
关于 const 的一些特性
在C++ 中只使用 const 常量而不使用宏常量
const 在类中的做用
若是想在类中共享一个常量,想固然的会使用 const 常量,可是这是不对的,由于 const 常量只在对象的生存期内是常量,可是对于整个类是可变的,由于一个类能够建立多个对象,不一样的对象 const 成员的值能够不一样。不能再类声明中初始化 const 数据成员,const 成员变量的初始化只能在构造函数过程当中
static 静态变量的做用范围只在一个文件内,程序开始的时候分配空间,程序结束的时候释放空间,默认初始化的值为 0,使用过程当中能够对 静态变量的值进行修改,静态变量和静态函数只有本文件内的代码才能看见它,它的名字在其余文件中不可见。
若是一个局部变量被声明为静态变量,那么将只有惟一的一个静态分配的对象,它被用于在该函数的全部调用中表示这个变量。这个对象在第一次执行它所在的线程时到达它的定义时初始化。当同时编译多个文件的时候,全部未加 static 的全局变量和函数都具备全局可见性,若是加了 static,那么就会对其余文件隐藏。
对于局部静态对象,构造函数是在控制线程第一次经过该对象的定义时调用。在程序结束时,局部静态对象的析构函数将按照他们被构造的相反顺序逐一调用,没有规定确切时间。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是惟一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static能够控制变量的可见范围,说到底static仍是用来隐藏的。
若是一个变量是类的一部分,但却不是该类的各个对象的一部分,它就被成为是一个static静态成员。一个static成员只有惟一的一份副本,而不像常规的非static成员那样在每一个对象里各有一份副本。同理,一个须要访问类成员,而不须要针对特定对象去调用的函数,也被称为一个static成员函数。类的静态成员函数只能访问类的静态成员(变量或函数)。 static的第三个做用是默认初始化为0.其实全局变量也具有这一属性,由于全局变量也存储在静态数据区.