C++ static的使用方法及不同含义讲解

 更新时间:2025年04月18日 16:47:11   作者:Vesan,  
在 C++ 里,static 是一个用途广泛的关键字,在不同场景下有不同含义,下面通过实例代码介绍C++ static的使用方法及不同含义讲解,感兴趣的朋友一起看看吧

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

1. 全局变量前的 static

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

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

示例代码

// 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 用于局部变量时,它会改变变量的存储方式和生命周期。

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

示例代码

#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 关键字后,函数变为静态函数,具有内部链接属性,只能在定义它的文件中调用,其他文件无法访问。

示例代码

// 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. 类的静态成员变量

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

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

示例代码

#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 指针,因此不能访问类的非静态成员变量和非静态成员函数,只能访问类的静态成员变量和静态成员函数。

示例代码

#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 关键字在不同的位置有不同的含义,主要体现在改变变量和函数的链接属性、存储方式、生命周期以及实现类的共享成员等方面。

到此这篇关于C++ static的使用方法及不同作用的文章就介绍到这了,更多相关C++ static使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 左值、右值、左值引用、右值引用的用途及区别

    C++ 左值、右值、左值引用、右值引用的用途及区别

    本文给大家介绍了C++左值、右值、左值引用、右值引用用途及区别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-09-09
  • C/C++实现精灵游戏的示例代码

    C/C++实现精灵游戏的示例代码

    这篇文章主要为大家介绍了如何利用C++实现简单的精灵游戏,文中的示例代码讲解详细,有一定的参考价值,感兴趣的小伙伴可以了解一下
    2022-06-06
  • 实例详解C++中指针与引用的区别

    实例详解C++中指针与引用的区别

    引用是C++引入的重要机制(C语言没有引用),它使原来在C中必须用指针来实现的功能有了另一种实现的选择,在书写形式上更为简洁,那么引用的本质是什么,它与指针又有什么关系呢?这篇文章主要给大家介绍了关于C++中指针与引用的区别,需要的朋友可以参考下
    2021-07-07
  • 浅谈C语言中的指针和数组有什么区别

    浅谈C语言中的指针和数组有什么区别

    C语言中的指针和数组是两个重要的数据结构,它们在内存管理和数据存储方面有许多相似之处,但也存在一些关键的区别,本文就来介绍一下C语言中的指针和数组有什么区别,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • C++ 实现静态链表的简单实例

    C++ 实现静态链表的简单实例

    这篇文章主要介绍了C++ 实现静态链表的简单实例的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++解析特殊符号tab和换行符号详情

    C++解析特殊符号tab和换行符号详情

    这篇文章主要给大家介绍的是C++解析一些特殊符号tab、换行符号的一些相关资料,需要的小伙伴可以参考下面文章的具体内容
    2021-09-09
  • 基于C语言实现点菜系统

    基于C语言实现点菜系统

    这篇文章主要为大家详细介绍了基于C语言实现点菜系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • 嵌入式C语言查表法在项目中的应用

    嵌入式C语言查表法在项目中的应用

    今天小编就为大家分享一篇关于嵌入式C语言查表法在项目中的应用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 从汇编看c++中变量类型的深入分析

    从汇编看c++中变量类型的深入分析

    本篇文章是对c++中的变量类型进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • 利用C语言实现2048小游戏的方法

    利用C语言实现2048小游戏的方法

    2048是比较流行的一款数字游戏,相信对大家来说都不陌生,这篇文章给大家分享了利用C语言实现2048小游戏的方法,对大家学习理解C语言具有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。
    2016-10-10

最新评论