1、const、mutable与volatile的区别:
const表明内存被初始化以后,程序将不能对它进行修改。
volatile则表明,即使程序代码没有对内存单元进行修改,但是里面的值也可能会发生变化,是一种意想不到地被改变。例如:将一个指针指向某个硬件位置,其中包含了来自串行端口的时间和信息,在某些情况下,硬件而不是程序可能会修改其中的内容,或者两个程序可能相互影响,共享数据。该关键字的作用就是为了改善编译器的优化能力。假设编译器发现程序在几条语句中两次使用某个变量的值,则编译器可能不是让程序查找这个编码的值两次,而是将这个值缓存到寄存器中。这种优化假设变量的值在这两次使用之间不会发生变化。如果不将变量声明为volatile,则编译器将进行这种优化,否则,相当于告诉编译器,不要进行这种优化。比如:状态寄存器、多线程中几个任务共享一个变量等情况下使用volatile。
mutable表明即使结构或者类变量为const,其某个成员也可以被修改。例如:
struct data
{
char name[20];
mutable int access;
}
const data vari={"mutalble usage",0};
strcpy(vari.name,"abcederj"); //not allowed
vari.access++; //allowed
2、静态变量在整个程序执行期间都存在。
a、对于在函数外面定义的变量:其所属文件中位于该变量的定义后面的所有函数都可以使用它(文件级的作用域),并可在程序的其他文件中使用(外部链接性),而且另一个文件如果要使用这个变量,必须使用extern关键字来声明它。
b、对于文件共享的变量,应该在一个文件中不使用extern来包含其定义声明,并且在其他文件中使用extern来包含引用声明。
c、在函数的外面使用static定义的变量,其作用域是整个文件,具有内部链接性,即不能用于其他文件。
d、在代码块中定义的static变量,作用域是该代码块,即具有局部作用域和无链接性,但是在整个程序的执行期间,它都一直存在并且保持原来的值。
e、C++的函数默认为外部连接性,因此可以在文件之间共享,但是使用关键字static限定的函数的链接性是内部的,只在定义的文件中使用,而不能在其他的文件中使用。
所以,总结static的用法和区别如下:
一、static全局变量和普通全局变量的区别:(改变作用域,不改变生存期)
在全局变量(外部变量)的说明之前加上static就构成了静态的全局变量。全局变量本身就是静态的存储方式,静态的全局变量当然也是静态存储方式,二者在存储方式上没有区别。其主要区别就在于:非静态全局变量的作用域是整个程序,当一个程序是由多个源文件组成时,非静态全局变量在各个文件中都是有效的;而静态全局变量则限制了作用域,也就是只在定义该变量的文件中有效,而在同一个程序中的其他文件中不能使用。由于静态的全局变量的作用域局限于一个源文件中,只能为该文件的函数公用,因此可以避免在其他源文件中引起错误。static全局变量只初始化一次,以防止在其他文件单元中被引用。
二、static局部变量和普通局部变量的区别:(改变生存期,不改变作用域)
将局部变量改成static变量后,改变了其变量的存储方式,即改变了变量的生存期。将全局变量改成static变量后,不改变其变量的存储方式,即不改变变量的生存期,改变了变 量的作用域。static局部变量只初始化一次,下一次保持上一次的结果值。
三、static函数和普通函数的区别:
static函数和普通函数的作用域不同,只在当前文件中使用的函数应该说明为static,即只在本文件中进行说明和定义。对于可在当前文件以外使用的函数,则应该在一个头文件中进行说明,若要使用这些函数的源文件就需要包含这个头文件。static函数在内存中只有一份,而普通函数在每个被调用中维持一份拷贝。
3、在C++中,char数组名、指向char的指针和用引号括起来的字符串常量都被解释为字符串的第一个字符的地址。