关于static关键字
暂不考虑类,static的作用主要有三条。
1)第一个作用:隐藏。
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,举例说明。假设我们要同时编译两个源文件,一个是a.c(或a.cpp),另一个是main.c(或main.cpp)。
下面是a.c的内容:
#include<cstdio>
char a = 'A';
void msg()
{
printf("hello\n");
}
则在a.c中定义的全局变量和函数msg能在main.c中使用。这是因为,所有未加static前缀的全局变量和函数都具有全局可见性,其他的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。反之加了static,就会隐藏。
2)第二个作用:默认初始化为0。
包括未初始化的全局静态变量与局部静态变量。其实未初始化的全局变量也具备这一属性,因为未初始化的全局变量与未初始化的静态变量是存储在同一块区域内的(BSS段)。
注:关于BSS,见程序内存分区
3)第三个作用:保持局部变量内容的持久。
函数内的局部变量,当调用时就存在,退出函数时就消失,但静态局部变量虽然在函数内定义,但静态局部变量始终存在着,也就是说他的生存期为整个源程序,其特点是只进行一次初始化且具有“记忆性”。
注:静态局部变量的生存期虽然为整个源程序,但是其作用域仍与局部变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。
类中static的作用
C++重用了static这个关键字,并赋予它与前面不同的含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数。
静态数据成员
static数据成员独立于该类的任意对象而存在:每个static数据成员是与类关联的对象,并不与该类的对象相关联,也就是说当某个类的实例修改了该变量,其修改值为其他所有实例所见。
static数据成员也存储在全局存储区。静态数据成员定义时要分配空间,所以不能在类声明中定义。static数据成员必须在类定义体的外部定义。不过,const static数据成员却可以在类的定义中初始化。
类中数据成员的布局情况是:
1)非静态成员在类对象中的排列顺序和声明顺序一致,任何在其中间声明的静态成员都不会被放进对象布局中。
2)静态数据成员存放在程序的全局存储中,和个别类对象无关。
C++标准规定,在同一个访问块中,成员的排列只需符合较晚出现的成员在类对象中有较高的地址即可,也就是说,并不一定要连续排列。
静态成员函数
static成员函数和static数据成员一样,都是类的内部实现,属于类定义的一部分,它为类服务而不是一个类的具体对象服务。
因为普通成员函数总是具体的属于某个类的具体对象,所以普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身。
但是静态成员函数由于不与任何对象相关联,因此它不具有this指针。因而它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数。
因为static成员不是任何对象的组成部分,所以static成员函数不能被声明为const。毕竟,将成员函数声明为const就是承诺不会修改该函数所属的对象,而static成员函数不属于任何对象。
关于const关键字
C++中,const限定符把一个对象转换成一个常量:
因为常量在定义后就不能被修改,所以定义时必须初始化。在全局作用域里定义非const变量时,它在整个程序中都可以访问。与其他变量不同,除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。通过指定const变为extern,就可以在整个程序中访问const对象、
const在C和C++中的区别
C编译器不能把const视为一个编译期间的常量。在C语言中使用const不是很有用,C破事程序员在预处理器里使用#define。
用const替代#define的值替换功能
const的最初动机是取代#define的值替换功能。使用const比使用#define有更多的优点:
1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误;
2)使用常量可能比使用#define导致产生更小的目标代码,这是因为预处理器“盲目的将宏名称替换为值”可能导致目标代码出现多份值得备份,但常量就不会出现这种情况。
3)同时const还可以执行常量折叠(常量折叠实在编译时间简单化常量表达的一个过程,简单来说就是将常量表达式求值,并用求的值来替换表达式,放入常量表),也就是说,编译器在编译时可以通过必要的计算降低常量表达式的复杂度。