static
在C++中,关键字static
有多种用途,它可以用于修饰变量、函数以及类的成员。根据它的上下文,static
的行为和意义有所不同。下面详细介绍static
关键字在不同场景中的用法。
# 1. 静态局部变量(Static Local Variable)
在函数内部定义的静态局部变量,其生命周期贯穿整个程序运行过程,而不是在函数调用结束时销毁。静态局部变量只在第一次执行时初始化,以后每次调用函数时,该变量都会保留其上一次的值。
void func() {
static int counter = 0; // 静态局部变量
counter++;
std::cout << "Counter: " << counter << std::endl;
}
int main() {
func(); // 输出: Counter: 1
func(); // 输出: Counter: 2
func(); // 输出: Counter: 3
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 2. 静态全局变量(Static Global Variable)
在文件作用域(通常是全局作用域)中声明的静态变量只能在该文件中访问,无法被其他文件中的代码访问。这样做可以避免命名冲突,是一种实现内部链接的方式。
static int globalVar = 0; // 静态全局变量
void increment() {
globalVar++;
}
int main() {
increment();
std::cout << globalVar << std::endl; // 输出: 1
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 3. 静态成员变量(Static Member Variable)
静态成员变量是类的所有对象共享的变量,而不是每个对象都有自己的一份拷贝。静态成员变量在程序启动时分配内存,直到程序结束时才释放。它们在类的所有实例之间共享。
- 声明:在类中声明静态成员变量。
- 定义:在类外定义静态成员变量,并进行初始化。
class MyClass {
public:
static int staticVar; // 声明静态成员变量
};
int MyClass::staticVar = 0; // 定义并初始化静态成员变量
int main() {
MyClass::staticVar = 10;
MyClass obj1;
MyClass obj2;
std::cout << obj1.staticVar << std::endl; // 输出: 10
std::cout << obj2.staticVar << std::endl; // 输出: 10
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 4. 静态成员函数(Static Member Function)
静态成员函数属于类而不是类的某个对象,它们不能访问非静态成员变量或非静态成员函数。静态成员函数可以通过类名直接调用,不需要通过类的对象调用。
class MyClass {
public:
static int staticVar;
static void staticFunc() {
std::cout << "Static Function: " << staticVar << std::endl;
}
};
int MyClass::staticVar = 0;
int main() {
MyClass::staticVar = 100;
MyClass::staticFunc(); // 输出: Static Function: 100
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 5. 静态函数(Static Function)
在文件作用域内定义的静态函数只能在定义它的文件中可见。其他文件中的代码无法访问该函数。这种用法用于实现模块化和封装。
static void myFunc() {
std::cout << "This is a static function." << std::endl;
}
int main() {
myFunc(); // 输出: This is a static function.
return 0;
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 6. 静态类(Static Class)
虽然C++不直接支持“静态类”,但可以通过将类的所有成员声明为静态的来模拟静态类的行为。这种类不需要实例化即可使用其成员。
class StaticClass {
public:
static void staticFunc() {
std::cout << "Static class function." << std::endl;
}
};
int main() {
StaticClass::staticFunc(); // 输出: Static class function.
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 总结
- 静态局部变量:在函数内部声明,生命周期贯穿整个程序运行过程,且值会在函数调用间保留。
- 静态全局变量:在文件作用域内声明,具有文件内链接,无法被其他文件访问。
- 静态成员变量:属于类而不是类的某个对象,所有对象共享同一个静态成员变量。
- 静态成员函数:可以通过类名直接调用,不需要通过对象访问,且只能访问静态成员变量。
- 静态函数:具有文件内链接,仅在声明它的文件内可见。
static
关键字在C++中有着广泛的用途,通过合理使用static
可以实现更好的封装、优化内存管理,并控制变量和函数的可见性。
编辑 (opens new window)
上次更新: 2024/09/13, 11:59:12