const
C++定义常量两种方式
1.define 宏常量: #define 常量名 常量值
通常在文件上方定义,表示一个常量
2.const修饰的变量 const 数据类型 常量名 = 常量值
通常在变量定义前加关键字const,修饰该变量为常量,不可修改
const修饰指针
1.const修饰指针–常量指针
2.const修饰常量–指针常量
3.const即修饰指针又修饰常量
int a = 10;
int b = 1;
//常量指针,指针指向地址里存放的内容不可以修改,但指针指向的地址可以修改
const int * p1=&a;
*值得注意的是常量指针还有一种写法:int const p1和上述写法等价
//指针常量,指针指向的地址不可以修改,但地址中存放的内容可以修改
int *const p2 = &b;
//既修饰指针又修饰常量,两者都不可以修改
const int * const p3 = &a;
记忆方法:谁在前面就强调谁不可改变,比如指针常量,指针在前面那就指针在前面地址不能变即指向不能变。常量指针,常量在前面,那就量不能变,即指向的内容不能变
static
函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义为全局的变量,但定义一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅只受此函数控制)。static 关键字则可以很好的解决这个问题。
静态数据的存储
全局(静态)存储区:分为 DATA 段和 BSS 段。DATA 段(全局初始化区)存放初始化的全局变量和静态变量;BSS 段(全局未初始化区)存放未初始化的全局变量和静态变量。程序运行结束时自动释放。其中BSS段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
在 C++ 中 static 的内部实现机制:静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。
在 C/C++ 中static的作用
(1)在修饰变量的时候,static 修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
(2)static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以。
(3)static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。初始化的时候自动初始化为 0。
(4)不想被释放的时候,可以使用static修饰。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用 static 修饰。
(5)考虑到数据安全性(当程序想要使用全局变量的时候应该先考虑使用 static)。
引用
引用的本质实际上是一个指针常量,它的指向不可以改变,但是它指向地址内存放的值是可以改变的。这也解释为什么引用在初始化后就不可以改变了。(再改变相当于改变了指向)
引用int &ref,内部会转换为int * const ref;是一个指针常量