C/C++中static的作用解析
需积分: 35 105 浏览量
更新于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`可以帮助编写更高效、更安全的代码。
2020-12-25 上传
2024-03-08 上传
2020-09-05 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
2023-03-31 上传
tangzhen8839
- 粉丝: 25
- 资源: 13
最新资源
- 构建基于Django和Stripe的SaaS应用教程
- Symfony2框架打造的RESTful问答系统icare-server
- 蓝桥杯Python试题解析与答案题库
- Go语言实现NWA到WAV文件格式转换工具
- 基于Django的医患管理系统应用
- Jenkins工作流插件开发指南:支持Workflow Python模块
- Java红酒网站项目源码解析与系统开源介绍
- Underworld Exporter资产定义文件详解
- Java版Crash Bandicoot资源库:逆向工程与源码分享
- Spring Boot Starter 自动IP计数功能实现指南
- 我的世界牛顿物理学模组深入解析
- STM32单片机工程创建详解与模板应用
- GDG堪萨斯城代码实验室:离子与火力基地示例应用
- Android Capstone项目:实现Potlatch服务器与OAuth2.0认证
- Cbit类:简化计算封装与异步任务处理
- Java8兼容的FullContact API Java客户端库介绍