c++ 静态 static关键字
目录
1. 静态局部变量 (Static Local Variables)
2. 静态全局变量 (Static Global Variables)
4. 类的静态成员 (Static Class Members)
在 C++ 中,static 是一个非常重要的关键字,它可以用来修饰变量、函数以及类成员等,具有多种用途。它的核心作用是控制变量或函数的存储方式和作用域。
1. 静态局部变量 (Static Local Variables)
-
定义: 在函数内部用 static 修饰的变量。
-
特点:
-
只在第一次调用函数时初始化一次,而不是每次函数调用都重新初始化。
-
它的生命周期贯穿整个程序运行期间,而不是随着函数调用结束而销毁。
-
但它的作用域仍然局限于定义它的函数内部。
-
-
示例:
#include <iostream> void test() { static int count = 0; // 只初始化一次 count++; std::cout << "Count: " << count << std::endl; } int main() { test(); // 输出: Count: 1 test(); // 输出: Count: 2 test(); // 输出: Count: 3 return 0; }解释: count 被声明为 static,所以它在程序运行期间只分配一次内存,后续调用 test() 时会保留之前的值并递增。
2. 静态全局变量 (Static Global Variables)
-
定义: 在全局范围内用 static 修饰的变量。
-
特点:
-
它的生命周期也是整个程序运行期间。
-
但它的作用域被限制在定义它的文件内(文件作用域),无法被其他文件通过 extern 访问。
-
-
示例:
// file1.cpp static int globalVar = 10; // 只在 file1.cpp 中可见 void printVar() { std::cout << globalVar << std::endl; } // file2.cpp // extern int globalVar; // 错误!无法访问 file1.cpp 中的 static globalVar用途: 用于防止全局变量被其他文件意外访问,增强模块封装性。
3. 静态函数 (Static Functions)
-
定义: 用 static 修饰的函数。
-
特点:
-
类似于静态全局变量,作用域被限制在定义它的文件内。
-
不能被其他文件通过声明调用。
-
-
示例:
// file1.cpp static void myFunction() { std::cout << "This is a static function." << std::endl; } // file2.cpp // myFunction(); // 错误!无法访问 file1.cpp 中的 static 函数用途: 通常用于封装只在本文件内使用的工具函数。
4. 类的静态成员 (Static Class Members)
在类中使用 static 有两种情况:静态成员变量和静态成员函数。
(1) 静态成员变量
-
定义: 用 static 修饰的类成员变量。
-
特点:
-
它属于类本身,而不是类的某个对象。
-
所有对象共享同一个静态成员变量。
-
必须在类外进行定义和初始化(通常在 .cpp 文件中)。
-
-
示例:
#include <iostream> class MyClass { public: static int sharedValue; // 声明静态成员变量 }; int MyClass::sharedValue = 100; // 定义并初始化 int main() { MyClass obj1, obj2; obj1.sharedValue = 200; // 修改静态成员 std::cout << obj2.sharedValue << std::endl; // 输出: 200 std::cout << MyClass::sharedValue << std::endl; // 输出: 200 return 0; }解释: sharedValue 是类的属性,通过类名或对象都可以访问和修改。
(2) 静态成员函数
-
定义: 用 static 修饰的类成员函数。
-
特点:
-
它属于类本身,不依赖于某个对象。
-
只能访问类的静态成员变量,无法访问非静态成员(因为没有 this 指针)。
-
-
示例:
#include <iostream> class MyClass { public: static int sharedValue; static void printValue() { std::cout << "Shared Value: " << sharedValue << std::endl; } }; int MyClass::sharedValue = 100; int main() { MyClass::printValue(); // 输出: Shared Value: 100 return 0; }用途: 常用于工具函数或管理类的静态数据。
5. static 的内存分配
-
静态变量(无论全局、局部还是类的静态成员)通常存储在程序的静态存储区(Data Segment),而不是栈或堆上。
-
这意味着它们的内存分配在程序启动时完成,程序结束时销毁。
6. 总结对比
|
类型 |
生命周期 |
作用域 |
初始化时机 |
|---|---|---|---|
|
静态局部变量 |
程序运行期间 |
函数内部 |
第一次调用时 |
|
静态全局变量 |
程序运行期间 |
文件内部 |
程序启动时 |
|
静态函数 |
程序运行期间 |
文件内部 |
无需初始化 |
|
静态成员变量 |
程序运行期间 |
类范围 |
类外定义时 |
|
静态成员函数 |
程序运行期间 |
类范围 |
无需初始化 |
7. 常见问题
-
为什么用 static?
-
控制作用域(限制访问)。
-
延长生命周期(避免重复初始化)。
-
实现类级别的共享数据或行为。
-
-
和非静态的区别?
-
非静态变量/函数依赖对象实例,每次创建对象时分配内存;静态的则与类或文件绑定,内存分配更持久且共享。
-
更多推荐
所有评论(0)