当前位置: 首页 > article >正文

C++中static和const的区别和用法

在C++中,staticconst是两个关键字,它们各自有不同的用途和语法。下面是它们的主要区别和用法:

const关键字

const关键字用于声明一个常量,即该变量的值在初始化后不能被修改。

用法:
  1. 局部变量

    void func() {
        const int a = 10; // a 是一个常量,值为10,不能在函数内部修改
        // a = 20; // 错误:不能给常量赋值
    }
    
  2. 全局变量

    const int g_a = 10; // g_a 是一个全局常量
    
  3. 指针

    • 指向常量的指针:

      const int *p = &a; // p 可以指向 int 类型变量,但不能通过 p 修改变量的值
      // *p = 20; // 错误:不能通过 p 修改值
      
    • 常量指针:

      int a = 10;
      int *const p = &a; // p 是一个常量指针,指向 a,p 的值(即存储的地址)不能改变
      // p = &b; // 错误:不能改变 p 的值
      
    • 指向常量的常量指针:

      const int *const p = &a; // p 指向一个常量 int,且 p 本身也是常量指针
      // *p = 20; // 错误:不能通过 p 修改值
      // p = &b; // 错误:不能改变 p 的值
      
  4. 类成员

    class MyClass {
    public:
        const int value; // 常量成员变量,必须在构造函数的初始化列表中初始化
        MyClass(int v) : value(v) {}
    };
    

static关键字

static关键字用于声明静态变量或函数,具有不同的作用范围和行为,取决于它的使用上下文。

用法:
  1. 局部变量

    • 静态局部变量在函数内部声明,但其生命周期贯穿整个程序运行期。它只在第一次进入该函数时被初始化一次。
      void func() {
          static int count = 0; // count 是一个静态局部变量,只在第一次调用 func 时初始化为 0
          count++;
          std::cout << count << std::endl;
      }
      
  2. 全局变量

    • 静态全局变量仅在声明它的文件内部可见,具有内部链接(internal linkage)。
      // file1.cpp
      static int globalVar = 10; // 仅在 file1.cpp 中可见
      
      // file2.cpp
      // extern int globalVar; // 错误:无法访问 file1.cpp 中的 static 全局变量
      
  3. 函数

    • 静态函数仅在声明它的文件内部可见。
      // file1.cpp
      static void myFunction() {
          // 函数体
      }
      
      // file2.cpp
      // void myFunction(); // 错误:无法访问 file1.cpp 中的 static 函数
      
  4. 类成员

    • 静态类成员属于类本身,而不是某个对象实例。它们必须在类外部定义和初始化。
      class MyClass {
      public:
          static int staticVar; // 静态成员变量
          static void staticFunc() { // 静态成员函数
              // 函数体
          }
      };
      
      int MyClass::staticVar = 10; // 静态成员变量的定义和初始化
      

总结

  • const用于声明常量,表示该变量的值不能被修改。
  • static用于声明静态变量或函数,具有延长生命周期或限制可见性的作用。

http://www.kler.cn/a/518117.html

相关文章:

  • leetcode——相交链表(java)
  • Spring Boot - 数据库集成02 - 集成JPA
  • DSP实验七 综合实验与考查
  • 数据库之PostgreSQL详解
  • 构建基于知识图谱的语义化问答系统
  • ray.rllib 入门实践-2:配置算法
  • Lua 初级教程
  • Android BitmapShader简洁实现马赛克,Kotlin(二)
  • Java设计模式 三十 状态模式 + 策略模式
  • ProfiNet转CANopen应用于汽车总装生产线输送设备ProfiNet与草棚CANopen质量检测系统
  • C++ —— vector 容器
  • 立创开发板入门ESP32C3第八课 修改AI大模型接口为deepseek3接口
  • Redis高阶3-缓存双写一致性
  • 【8】思科IOS AP升级操作
  • 【Flutter】旋转元素(Transform、RotatedBox )
  • 【EI会议推荐】人工智能、电子信息、智能制造、机器人、自动化、控制科学、机械制造等计算机领域多主题可选!
  • STM32 调试小问题记录
  • qsort和std::sort比较函数返回值的说明
  • 《CPython Internals》阅读笔记:p353-p355
  • 正点原子Linux 移植USB Wifi模块MT7601U驱动(上)