C/C++中static的作用解析

需积分: 35 4 下载量 104 浏览量 更新于2024-09-18 收藏 59KB DOC 举报
"C/C++中static作用" C/C++中的`static`关键字有着双重含义,分别在面向过程和面向对象的编程中起着不同的作用。本文主要探讨的是`static`在C++中的两种应用场景。 首先,让我们来看看面向过程设计中的`static`。 1. 静态全局变量 在全局变量前添加`static`关键字,就将其声明为静态全局变量。静态全局变量的作用域限于当前源文件,其他文件无法访问,这提供了数据的封装性。与普通的全局变量相比,它们在程序执行开始时初始化为0,并且在整个程序生命周期内保持其值。例如: ```cpp // Example1 #include <iostream> void fn(); static int n; // 定义静态全局变量 int main() { n = 20; std::cout << n << std::endl; fn(); } void fn() { n++; std::cout << n << std::endl; } ``` 在这个例子中,`fn()`函数可以访问并修改静态全局变量`n`的值,而其他文件无法直接访问`n`。如果去掉`static`,全局变量`n`则变为普通全局变量,可在所有文件中可见。 2. 静态局部变量 在函数内部声明的`static`变量称为静态局部变量。这些变量只在声明它们的函数内部可见,且在函数每次调用之间保留其值。这意味着即使函数结束,它们的存储也不会被释放。例如: ```cpp void count_calls() { static int counter = 0; counter++; std::cout << "Function called " << counter << " times." << std::endl; } int main() { count_calls(); // prints "Function called 1 times." count_calls(); // prints "Function called 2 times." return 0; } ``` 在这个例子中,`count_calls`每次被调用时,`counter`都会递增,因为它在函数调用之间保持其值。 接下来,我们转向面向对象编程中的`static`。 3. 类中的静态成员 在类中,`static`关键字用于声明静态成员变量和静态成员函数。静态成员不属于任何特定的对象实例,而是属于类本身。这意味着所有对象实例共享同一份静态成员变量的副本,而静态成员函数可以直接通过类名调用,无需创建对象。 ```cpp class MyClass { public: static int count; // 静态成员变量 static void incrementCount() { count++; } // 静态成员函数 }; int MyClass::count = 0; int main() { MyClass obj1, obj2; MyClass::incrementCount(); // 增加计数器 std::cout << MyClass::count << std::endl; // 输出计数器的值 return 0; } ``` 在这个例子中,`MyClass::count`是所有`MyClass`对象共享的,而`incrementCount`函数可以不依赖于任何对象实例来操作这个计数器。 总结来说,`static`在C++中扮演了重要的角色,提供了数据的封装、跨函数调用的持久存储以及类级别的共享数据。理解并熟练运用`static`可以帮助编写更高效、更安全的代码。