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

news/2025/2/1 2:51:54/

在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 时初始化为 0count++;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.ppmy.cn/news/1568308.html

相关文章

springboot集成钉钉,发送钉钉日报

目录 1.说明 2.示例 3.总结 1.说明 学习地图 - 钉钉开放平台 在钉钉开放文档中可以查看有关日志相关的api&#xff0c;主要用到以下几个api&#xff1a; ①获取模板详情 ②获取用户发送日志的概要信息 ③获取日志接收人员列表 ④创建日志 发送日志时需要根据模板规定日志…

2K320Hz显示器哪个好?

2K320Hz显示器哪个好&#xff1f;320Hz这种高刷新率的显示器确实很少见&#xff0c;那究竟哪个牌子哪个型号更适合你呢&#xff1f; 1.HKC G27H4Pro - 2K320Hz显示器哪个好 外观设计 - HKC G27H4Pro 2K320Hz显示器 三面微边框超震撼&#xff1a;采用三面微边框设计&#xff0…

【C++】设计模式详解:单例模式

文章目录 Ⅰ. 设计一个类&#xff0c;不允许被拷贝Ⅱ. 请设计一个类&#xff0c;只能在堆上创建对象Ⅲ. 请设计一个类&#xff0c;只能在栈上创建对象Ⅳ. 请设计一个类&#xff0c;不能被继承Ⅴ. 请设计一个类&#xff0c;只能创建一个对象&#xff08;单例模式&#xff09;&am…

【SpringBoot教程】Spring Boot + MySQL + HikariCP 连接池整合教程

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 在前面一篇文章中毛毛张介绍了SpringBoot中数据源与数据库连接池相关概念&#xff0c;今天毛毛张要分享的是关于SpringBoot整合HicariCP连接池相关知识点以及底层源码…

LeetCode 0219.存在重复元素 II:哈希表

【LetMeFly】219.存在重复元素 II&#xff1a;哈希表 力扣题目链接&#xff1a;https://leetcode.cn/problems/contains-duplicate-ii/ 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs…

深入解析JUnit中的@ClassRule注解

在Java开发中&#xff0c;JUnit是一个非常流行的单元测试框架&#xff0c;它为开发者提供了强大的工具来编写和执行测试用例。今天&#xff0c;我们来深入探讨一下JUnit中的ClassRule注解&#xff0c;看看它是如何工作的&#xff0c;并通过一个实际的示例来加深理解。 一、Clas…

SOME/IP--协议英文原文讲解1

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 一、SOM…

深度学习探索:ChatGPT数据分析精髓 梯度下降优化方法深度剖析

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…