C++:static修饰符

在C++中,static关键字有多种用途,主要用于控制变量和函数的存储持续性和可见性。以下是static关键字的几种常见用法:

1. 静态局部变量

静态局部变量在函数内部定义,但其生命周期贯穿整个程序运行期间。它们只在第一次调用时初始化,并且在后续调用中保持其值。

示例
#include <iostream>

void counter() {
    static int count = 0; // 静态局部变量
    count++;
    std::cout << "Count: " << count << std::endl;
}

int main() {
    counter(); // 输出: Count: 1
    counter(); // 输出: Count: 2
    counter(); // 输出: Count: 3
    return 0;
}

2. 静态全局变量

静态全局变量在文件范围内可见,但不能被其他文件访问。这有助于实现数据封装和模块化。

示例
// file1.cpp

static int globalVar = 42; // 静态全局变量

void printGlobalVar() {
    std::cout << "GlobalVar: " << globalVar << std::endl;
}

// file2.cpp
extern void printGlobalVar();

int main() {
    printGlobalVar(); // 输出: GlobalVar: 42
    return 0;
}

3. 静态成员变量

静态成员变量属于类,而不是类的某个对象。它们在所有对象之间共享,并且在类的所有实例中只有一个副本。

示例
#include <iostream>

class MyClass {
public:
    static int staticVar; // 静态成员变量
    
    void increment() {
        staticVar++;
    }
};

int MyClass::staticVar = 0; // 静态成员变量定义

int main() {
    MyClass obj1, obj2;
    obj1.increment();
    obj2.increment();
    std::cout << "StaticVar: " << MyClass::staticVar << std::endl; // 输出: StaticVar: 2
    return 0;
}

4. 静态成员函数

静态成员函数属于类,而不是类的某个对象。它们只能访问静态成员变量和静态成员函数,不能访问非静态成员。

示例
#include <iostream>

class MyClass {
public:
    static int staticVar;

    static void staticFunction() {
        std::cout << "StaticVar: " << staticVar << std::endl;
    }
};

int MyClass::staticVar = 42;

int main() {
    MyClass::staticFunction(); // 输出: StaticVar: 42
    return 0;
}

在C++中,static关键字不仅可以用于变量,还可以用于函数。根据函数的作用域和可见性,static关键字可以用于定义静态局部函数和静态全局函数。

5.静态局部函数

严格来说,C++中并没有“静态局部函数”这个概念。函数的定义本身就是全局的,不能在函数内部定义另一个函数。因此,我们主要讨论静态全局函数。

6.静态全局函数

静态全局函数是指在文件范围内可见的函数。通过在函数定义前加上static关键字,可以将该函数的作用域限制在定义它的文件内。这有助于实现模块化和数据封装,防止命名冲突

示例

假设我们有两个文件:file1.cppfile2.cpp

// file1.cpp
#include <iostream>

static void staticFunction() {
    std::cout << "This is a static function in file1.cpp" << std::endl;
}

void callStaticFunction() {
    staticFunction();
}

// file2.cpp
#include <iostream>

extern void callStaticFunction();

int main() {
    callStaticFunction(); // 输出: This is a static function in file1.cpp
    // staticFunction(); // 错误: 'staticFunction' 在此作用域中未声明
    return 0;
}

在这个示例中:

  • staticFunctionfile1.cpp中定义,并且使用了static关键字,因此它只能在file1.cpp中访问。
  • callStaticFunction是一个普通的全局函数,可以在其他文件中通过extern关键字进行声明和调用。

总结

  • 静态局部变量:在函数内部定义,生命周期贯穿整个程序运行期间。
  • 静态全局变量:在文件范围内可见,不能被其他文件访问。
  • 静态成员变量:属于类,在所有对象之间共享。
  • 静态成员函数:属于类,只能访问静态成员。
  • 静态全局函数:将函数的作用域限制在定义它的文件内,其他文件访问不到。

static关键字在C++中提供了灵活的存储持续性和可见性控制,有助于实现数据封装和模块化。理解static的不同用法,有助于编写更高效和可维护的代码。

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值