c++之static和const
一 static
static 作⽤:控制变量的存储⽅式和可⻅性,且其值可以被修改
1.1 作用1
作⽤⼀:修饰局部变量:⼀般情况下,对于局部变量在程序中是存放在栈区的,并且局部的⽣
命周期在包含语句块执⾏结束时便结束了。但是如果⽤ static 关键字修饰的话,该变量便会存
放在静态数据区,其⽣命周期会⼀直延续到整个程序执⾏结束。但是要注意的是,虽然⽤
static 对局部变量进⾏修饰之后,其⽣命周期以及存储空间发⽣了变化,但其作⽤域并没有改
变,作⽤域还是限制在其语句块。
【解释】
1. 需要在函数多次调用间保留状态
普通局部变量每次进入函数都会重新初始化,离开函数就销毁;而 static
局部变量只会在第一次进入函数时初始化一次,后续调用会保留上一次的值。这让函数可以 “记住” 之前的状态。
例如,实现一个计数器,每次调用函数就加 1:
#include <stdio.h>void count() {static int num = 0; // 仅第一次调用时初始化,后续调用不执行num++;printf("第 %d 次调用\n", num);
}int main() {count(); // 第 1 次调用count(); // 第 2 次调用count(); // 第 3 次调用return 0;
}
如果 num
是普通局部变量,每次调用都会重置为 0,无法实现计数功能;而 static
修饰后,它能在多次调用间保留状态。
2. 避免全局变量的 “污染”
如果为了保留状态而使用全局变量,会导致变量在整个程序中可见(作用域过大),可能被其他代码意外修改,造成 “全局变量污染”。
而 static
局部变量的作用域仍局限于函数内部,仅在该函数内可访问,既实现了状态保留,又保证了封装性(其他函数无法直接修改它),比全局变量更安全。
1.2 作用2
作⽤⼆:修饰全部变量:对于⼀个全局变量,它既可以在本⽂件中被访问到,也可以在同⼀个
⼯程中其它源⽂件被访问(添加 extern进⾏声明即可)。⽤ static 对全局变量进⾏修饰改变了其
作⽤域范围,由原来的整个⼯程可⻅变成了本⽂件可⻅。
1.3 作用3
作⽤三:修饰函数:⽤ static 修饰函数,情况和修饰全局变量类似,也是改变了函数的作⽤
域。
1.4 作用4
作⽤四:修饰类:如果 C++ 中对类中的某个函数⽤ static 修饰,则表示该函数属于⼀个类⽽
不是属于此类的任何特定对象;如果对类中的某个变量进⾏ static 修饰,则表示该变量以及所
有的对象所有,存储空间中只存在⼀个副本,可以通过;类和对象去调⽤。
(补充:静态⾮常量数据成员,其只能在类外定义和初始化,在类内仅是声明⽽已。)
1.5 作用5
作⽤五:类成员/类函数声明 static
二 const
含义及实现机制
2.1 作用1
const 修饰基本类型数据类型:基本数据类型,修饰符 const 可以⽤在类型说明符前,也可以
⽤在类型说明符后,其结果是⼀样的。在使⽤这些常量的时候,只要不改变这些常量的值即
可。
2.2 作用2
const 修饰指针变量和引⽤变量:如果 const 位于⼩星星的左侧,则 const 就是⽤来修饰指针
所指向的变量,即指针指向为常量;如果 const 位于⼩星星的右侧,则 const 就是修饰指针
本身,即指针本身是常量。