静态局部变量 静态函数
static局部变量分配于静态存储区(初始化分配于data区,未初始化分配于BSS区)。
在函数体内定义的static变量的作用范围为该函数体,函数调用完成之后不释放。
静态局部变量和普通局部变量的作用域是一样的,都是针对局部使用,在函数外不能使用。
但是生存期不同,静态局部变量的生存期为整个程序运行期间。
static修饰全局变量或函数时,表示本地性。
static全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的。
static函数表示该函数只能在本源文件进行调用,其他文件或模块不能调用。
这里static作用只是限定了作用域(仅限于本文件)。这样的话模块开发时不同源文件下的static函数可以同名。
对于全局变量而言,无论是否有static修饰,其存储区域都是全局数据区,生命周期都是全局的。
初始化:全局变量(含static全局变量)的初始化是在main函数运行之前。函数内部的静态局部变量的初始化是在函数第一次调用时执行。
静态成员变量 静态成员函数
静态成员变量是类的成员变量,是类的所有对象中共享的成员,通常用于表示全局性质的数据,比如计数器、标识符等。
静态成员函数是类的成员函数,可以直接通过类名调用。静态成员函数通常用于执行全局性质的操作,比如工厂函数、单例模式等。
静态成员变量必须初始化且要在实现中进行,不能在头文件进行。
静态成员变量或静态成员函数,表示该变量或函数属于类,不属于该类的实例对象,是该类的所有对象共用。由于变量和函数对于此类的唯一性,可以用类名直接引用。
静态成员函数不与对象相联系,因此不具有this指针,无法访问类对象的非静态数据成员,也无法访问非静态成员函数,只能调用静态成员函数。普通成员函数可访问静态成员变量、也可以访问非经常成员变量。
#include <stdlib.h>
#include <iostream>
using namespace std;
class StaticTest
{
public:
StaticTest(int a, int b);
void GetSum();
static void f1(StaticTest &s);
private:
int A, B;
static int Sum;
};
int StaticTest::Sum = 0;//静态成员在此初始化
StaticTest::StaticTest(int a, int b) {
A = a; B = b;
Sum += A + B;
}
void StaticTest::GetSum() {
cout << "Sum = " << Sum << endl;
}
//静态方法不能直接调用非晶态成员,可以通过对象引用实现调用
void StaticTest::f1(StaticTest &s)
{
cout << s.A << endl;
cout << Sum << endl;
}
int main(void)
{
StaticTest M(3, 7), N(14, 9);
M.GetSum();
N.GetSum();
StaticTest::f1(M);
return 0;
}