C++ static的使用方法及不同作用

在 C++ 里,static 是一个用途广泛的关键字,在不同场景下有不同含义,下面为你详细介绍:

1. 全局变量前的 static

static 用在全局变量前时,它会改变变量的链接属性。

  • 默认全局变量 :默认的全局变量具有外部链接属性,这意味着在一个文件中定义的全局变量可以在其他文件中通过 extern 关键字声明后使用。
  • 静态全局变量 :在全局变量前加上 static 关键字后,变量变为静态全局变量,具有内部链接属性,只能在定义它的文件中使用,其他文件无法访问。

示例代码

cpp 复制代码
// file1.cpp
#include <iostream>

// 静态全局变量
static int staticGlobalVar = 10; 

// 普通全局变量
int globalVar = 20; 

void printStaticGlobalVar() {
    std::cout << "Static global variable: " << staticGlobalVar << std::endl;
}

// file2.cpp
#include <iostream>
// extern int staticGlobalVar; // 错误,无法在其他文件中访问静态全局变量
extern int globalVar;

int main() {
    // std::cout << staticGlobalVar << std::endl; // 错误
    std::cout << "Global variable: " << globalVar << std::endl;
    return 0;
}

2. 局部变量前的 static

static 用于局部变量时,它会改变变量的存储方式和生命周期。

  • 普通局部变量:普通局部变量存储在栈上,在函数调用结束后会被销毁。
  • 静态局部变量:静态局部变量存储在全局数据区,只在第一次调用函数时初始化,之后再次调用函数时,静态局部变量会保留上一次调用结束时的值。

示例代码

cpp 复制代码
#include <iostream>

void staticLocalVariableExample() {
    static int staticLocalVar = 0; // 静态局部变量
    int normalLocalVar = 0; // 普通局部变量

    std::cout << "Static local variable: " << staticLocalVar << std::endl;
    std::cout << "Normal local variable: " << normalLocalVar << std::endl;

    staticLocalVar++;
    normalLocalVar++;
}

int main() {
    staticLocalVariableExample();
    staticLocalVariableExample();
    return 0;
}

3. 函数前的 static

static 用于函数前时,它会改变函数的链接属性。

  • 默认全局函数 :默认的全局函数具有外部链接属性,可以在其他文件中通过 extern 关键字声明后调用。
  • 静态函数 :在函数前加上 static 关键字后,函数变为静态函数,具有内部链接属性,只能在定义它的文件中调用,其他文件无法访问。

示例代码

cpp 复制代码
// file1.cpp
#include <iostream>

// 静态函数
static void staticFunction() {
    std::cout << "This is a static function." << std::endl;
}

// 普通函数
void normalFunction() {
    std::cout << "This is a normal function." << std::endl;
}

// file2.cpp
#include <iostream>
// extern void staticFunction(); // 错误,无法在其他文件中调用静态函数
extern void normalFunction();

int main() {
    // staticFunction(); // 错误
    normalFunction();
    return 0;
}

4. 类的静态成员变量

类的静态成员变量属于整个类,而不是类的某个对象,所有对象共享同一个静态成员变量。

  • 存储位置:静态成员变量存储在全局数据区,不随对象的创建和销毁而分配和释放内存。
  • 初始化:静态成员变量必须在类外进行初始化。

示例代码

cpp 复制代码
#include <iostream>

class MyClass {
public:
    static int staticMemberVar; // 类内声明静态成员变量
    int normalMemberVar;

    MyClass(int value) : normalMemberVar(value) {}
};

// 类外初始化静态成员变量
int MyClass::staticMemberVar = 0; 

int main() {
    MyClass obj1(10);
    MyClass obj2(20);

    obj1.staticMemberVar = 30;
    std::cout << "obj2.staticMemberVar: " << obj2.staticMemberVar << std::endl; // 输出 30
    return 0;
}

5. 类的静态成员函数

类的静态成员函数属于整个类,而不是类的某个对象,可以直接通过类名调用,也可以通过对象调用。

  • this 指针 :静态成员函数没有 this 指针,因此不能访问类的非静态成员变量和非静态成员函数,只能访问类的静态成员变量和静态成员函数。

示例代码

cpp 复制代码
#include <iostream>

class MyClass {
public:
    static int staticMemberVar;
    int normalMemberVar;

    static void staticMemberFunction() {
        staticMemberVar = 10; // 可以访问静态成员变量
        // normalMemberVar = 20; // 错误,不能访问非静态成员变量
        std::cout << "Static member function called. staticMemberVar: " << staticMemberVar << std::endl;
    }
};

int MyClass::staticMemberVar = 0;

int main() {
    MyClass::staticMemberFunction(); // 通过类名调用静态成员函数
    MyClass obj;
    obj.staticMemberFunction(); // 通过对象调用静态成员函数
    return 0;
}

综上所述,static 关键字在不同的位置有不同的含义,主要体现在改变变量和函数的链接属性、存储方式、生命周期以及实现类的共享成员等方面。

相关推荐
学编程就要猛1 分钟前
算法:1.移动零
java·算法
YYDS3142 分钟前
次小生成树
c++·算法·深度优先·图论·lca最近公共祖先·次小生成树
xu_yule5 分钟前
算法基础(区间DP)
数据结构·c++·算法·动态规划·区间dp
biter down8 分钟前
C++ 交换排序算法:从基础冒泡到高效快排
c++·算法·排序算法
开开心心_Every13 分钟前
优化C盘存储:自定义软件文档保存路径工具
java·网络·数据库·typescript·word·asp.net·excel
多则惑少则明13 分钟前
AI大模型实用(八)Java快速实现智能体整理(使用LangChain4j-agentic来进行情感分析/分类)
java·人工智能·spring ai·langchain4j
落羽的落羽15 分钟前
【C++】深入浅出“图”——图的遍历与最小生成树算法
linux·服务器·c++·人工智能·算法·机器学习·深度优先
qq_3771123716 分钟前
JAVA的平凡之路——此峰乃是最高峰JVM-GC垃圾回收器(2)-06
java·开发语言·jvm
用户21903265273520 分钟前
别再到处try-catch了!SpringBoot全局异常处理这样设计
java·spring boot·后端
李少兄22 分钟前
深入理解 Java Web 开发中的 HttpServletRequest 与 HttpServletResponse
java·开发语言·前端