一. 主要作用
- 隐藏
当同时编译多个文件时,所有未加static前缀的全局变量和函数都全局可见 - 保持变量内容持久
存储在静态数据区,程序开始运行时就完成初始化 - 默认初始化为0
二. 类外:
全局静态变量
参考主要作用
局部静态变量
局部静态变量是在程序执行到该对象的声明处时首次初始化,后面函数调用不再进行初始化
int fun()
{
static int f1 = 0;
f1 += 1;
return f1;
}
int main(int argc, char** argv)
{
for (int i = 0; i < 5; i++) {
int val = fun();
cout << val << endl;//1 2 3 4 5
}
return 0;
}
静态函数:
#include <iostream>
// 声明一个普通函数
void ordinaryFunction() {
std::cout << "This is an ordinary function." << std::endl;
}
// 声明一个静态函数
static void staticFunction() {
std::cout << "This is a static function." << std::endl;
// 在静态函数中调用普通函数
ordinaryFunction();
// 在静态函数中访问普通变量
int x = 10;
std::cout << "Value of x: " << x << std::endl;
}
int main() {
// 调用静态函数
staticFunction();
return 0;
}
静态函数和普通函数的区别?
静态函数在内存中只有一份,普通静态函数在每个调用中位置一份拷贝程序的局部变量在堆栈中
三. 类内:
静态成员变量
-
静态成员变量必须在类声明的外部初始化。
-
静态成员变量是在初始化时分配内存的,程序结束时释放内存。
-
静态成员变量可以通过类名或对象名来引用,非静态成员变量只能通过对象名引用。
#include <iostream>
class MyClass {
public:
static int staticVar; // 声明静态成员变量
};
// 在类外部初始化静态成员变量
int MyClass::staticVar = 5;
int main() {
std::cout << "Static variable: " << MyClass::staticVar << std::endl;
return 0;
}
静态成员函数
-
静态成员函数中不可以定义 this、super 关键字。
-
静态成员函数只能访问静态成员,非静态成员函数既可访问静态成员也可访问非静态成员。
-
静态成员函数可以通过类名或对象名来引用,非静态成员函数只能通过对象名引用
#include <iostream>
class MyClass {
public:
// 声明静态成员函数
static void staticMemberFunction() {
std::cout << "This is a static member function." << std::endl;
}
};
int main() {
// 直接通过类名调用静态成员函数
MyClass::staticMemberFunction();
return 0;
}
静态成员属于类本身,而不属于对象,如何理解?
- 共享性:静态成员被所有类的对象共享,他不是存储在对象中,而是存储在内存空间中
- 访问权限:静态成员可以访问类的所有私有成员,应为他们属于类本身
参考鸣谢
阿秀的学习笔记