C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。
一、面向过程程序设计
1、普通变量
(1)在内存分配上,static修饰的变量内存分配在全局数据区。
(2)与局部变量相比,未经初始化的static修饰的变量会被程序自动初始化为0(局部变量的值是随机的,除非它被显式初始化)
(3)在作用域上,static修饰的局部变量作用域与普通局部变量的作用域相同,而static修饰的全局变量作用域与普通全局变量作用域不同,前者在文件之外是不可见的,而后者在文件之外可见。
接下来做一个实验验证第3点作用域不同,如果已会可忽略。
实验:自定义test.cpp和main.cpp
当把main.cpp中的int a前加上修饰static,编译器会报错undefined reference to `a',证明了static修饰的变量在文件之外是不可见的。而把main.cpp中的int a前不加任何修饰时,编译正确通过,可见普通全局变量在文件之外可见。
//test.cpp
#include <iostream>
using namespace std;
extern int a;
void test(){
printf("Welcome to test.cpp\nThe value of a is %d\n", a);
}
// main.cpp
#include <iostream>
using namespace std;
void test();
int a;
int main(){
a = 10;
test();
return 0;
}
2、函数
在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。
二、面向对象程序设计
1、静态数据成员
(1)在内存分配与初始化上,static修饰的变量内存分配在全局数据区。 静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:<数据类型><类名>::<静态数据成员名>=<值>
(2)在对象使用上,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。
2、静态成员函数
(1)静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数,但不能访问非静态成员函数和非静态数据成员;
(2)非静态成员函数可以任意地访问静态成员函数和静态数据成员