目录
C语言中静态变量
C++静态成员变量
C++静态成员函数
C语言中静态变量
1.函数内部用static修饰的变量,只能在此函数使用,但所修饰的变量不随函数释放而释放,下次调用时的值仍为上次结束时的值 |
2.static修饰的全局变量只能在其定义的文件使用 |
3.static修饰的函数只能在其所在的文件中被调用 |
知识点:static修饰的静态成员变量或成员函数是在编译链接过程中就分配好了内存空间,而普通成员函数是在运行过程中分配空间(根据 分配空间的时间点 这个知识点理解下文)
C++静态成员变量
1.C++类中的成员变量放置在全局静态变量区 |
2.C++类中的静态成员变量可以多个类成员之间数据共享 |
3.C++类中的成员变量必须在对应的cpp文件中进行定义(类成员函数只是声明,可以类比C中extern声明的int变量) |
4.C++类中静态成员变量不能在构建函数中以列表方式初始化 |
// a.h文件
class A
{
public:
// A():i(10){}//错误,不能以列表方式初始化静态成员变量
A(){ i = 10; } //正确
void set(int ii) { i = ii; }
void print(void) { cout << "A::i = " << i << endl; }
private:
static int i;
}
//main.cpp文件
int A::i; //类成员变量必须在对应cpp中进行定义,且不能用static修饰。否则与C标准中static修饰变量只能在本文件使用的规则冲突,从而报错
int main(void)
{
A a,b;
b.set(20); //成员变量b对i进行赋值
a.print(); //最后输出 A::i = 20, 静态成员变量可以多个类成员之间数据共享
return 0;
}
C++静态成员函数
1.static成员函数内不能使用this指针 |
2.static修饰的成员函数只能处理static修饰的成员函数或变量 |
3.static修饰的成员函数可以在类没有实例化时调用 |
class A
{
public:
A(){ }
void print(void){ cout << "A::print()" << endl;}
static void fun(void)
{
cout << "i: " << i << endl; //正确
//下面错误写法的原因都是 类A未实例化,在内存中未分配空间,导致找不到对应变量或函数
// cout << "i: " << this->i << endl; //报错,“this”: 只能在非静态成员函数或非静态数据成员初始值设定项的内部引用
// print(); //报错,“A::printf”: 非静态成员函数的非法调用
// cout << "k: " << k << endl; //报错,对非静态成员“A::k”的非法引用
//原因,当main函数使用 A::fun()调用此函数时,k并未定义,所以找不到k
}
private:
static int i;
int k;
}
int main(void)
{
// A::print(); //错误, 非static成员函数只能实例化后调用
A::fun(); //正确,在编译链接时期就对static成员函数分配了空间,可以直接调用
return 0;
}
static修饰类实例
1.静态类实例化时,是在编译链接时就已经分配好空间,但在使用时进行初始化 |
2.类实例化用static修饰时,它的析构函数在程序执行完成之后执行,而非对应的函数执行完毕 |
3.多个cpp文件定义static的类实例化时,类的构造函数执行是随机的 |
//a.h文件
class A
{
public:
A() : i(0){ cout << "A() " << endl; }
void print(void) { cout << "A::i = " << i << endl; }
private:
int i;
};
//b.cpp文件
void b_fun()
{
static A bFun;
}
//c.cpp文件
void c_fun()
{
static A cFun;
}
//main.cpp文件
int main(void)
{
cout << "Main Begin!" << endl;
static A a;
a.print();
cout << "Main end!" << endl;
return 0;
}
//b.cpp和c.cpp中的 bFun 和 cFun 的分配内存时间不能确定先后顺序