1. static
static的产生背景:
我们都知道函数内部定义的变量,分配在栈空间上,栈上分配的空间伴随着函数的结束而释放。此时产生一个问题,如果想将函数中的此值保存至下一次调用时,该如何实现?为此,引入了static关键字,修饰变量,告诉编译器让其分配在静态存储区,这样既实现了目的,又使得此变量的作用范围不变。
作用总结:
1. static使得变量或对象的存储变成静态存储,在函数体内修改,改变其存储方式。
连接方式为内部连接,在全局变量上修饰,改变其连接方式,也即作用范围。
2. const
2.1 const的产生背景:
1. C++是一个类型严格的编译系统,使得C++程序的错误在编译阶段就可发现,使得出错率降低,这是C++比C优势的地方。
2. C中有很常见的预处理指令 #define room_number 412 ,可以很方便的进行替代,这种替代有三方面的优点
避免了意义模糊的数字出现,使得程序的语义更流畅
可以很方便的进行参数调整
提高了程序的执行效率,使用了预编译进行值替代
但是伴随着缺点:
预处理语句仅仅是进行简单的替代,缺乏类型检测机制。这样预处理就不能享受C++的严格的类型检测,称为隐患。
const推出的目的,就是为了取代预编译指令,消除它的缺点,同时集成其优点。
2.2 const的具体作用
1. const用于指针情况分析
int const *A //A可变, *A不可变,即指针指向的内容不可变,指针的值可变。
int *const A //A不可变,*A可变, 即指针的值不变,指向的内容可变。
2. const限定函数的传递值参数:
void FUNC(const int Var);
限定参数在函数体中不可被改变。
3. const 限定函数的值型号返回值
const int Fun1();
const MyClass Fun2();
分析:上述写法限定函数的返回值不可被更新,当函数返回内部的类型时(如Fun1),已经是一个数值,当然不可被赋值更新,所以,此时const无意义,最好去掉,以免困惑。当函数返回自定义的类型时(如Fun2),这个类型仍然包含可以被赋值的变量成员,所以,此时有意义。
4. 传递与返回地址: 此种情况最为常见,由地址变量的特点可知,适当使用const,意义昭然。
5. const 限定类的成员函数:
class ClassName {
public:
int Fun() const;
.....
}
注意:采用此种const 后置的形式是一种规定,亦为了不引起混淆。在此函数的声明中和定义中均要使用const,因为const已经成为类型信息的一部分。
获得能力:可以操作常量对象。
失去能力:不能修改类的数据成员,不能在函数中调用其他不是const的函数。
3. volatile 关键字
volatile 的产生背景,当一个值需要多方共同使用时候,一方进行了更新,但是另一方使用的时候,却发生数值仍然是原来的值,而非最新值,究其原因,是因为编译器进行了优化,并没有实时的更新此值。
为了解决这个问题,引入了volatile关键字,告诉编译器不要对此做优化。每次读取更改变量都是“直接存取原始内存地址。
下面是volatile变量的几个例子:
1)并行设备的硬件寄存器(如:状态寄存器)
2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3)多线程应用中被几个任务共享的变量\
这是区分C程序员和嵌入式系统程序员的最基本的问题:嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所有这些都要求使用volatile变量。不懂得volatile内容将会带来灾难。
网友评论