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

static成员

C++ 中的 static 成员
 
static 成员是类中特殊的成员,它们与类本身关联,而不是与类的各个对象实例关联。static 成员分为 static 成员变量和 static 成员函数。
 
一、static 成员变量
 
1. 基本特性
 
- 类范围共享:所有类对象共享同一个 static 成员变量
- 独立于对象:即使没有创建任何对象,static 成员也存在
- 单一定义:需要在类外单独定义和初始化
 
2. 声明与定义
 
class MyClass {
public:
    static int count;  // 声明(类内)
    
    MyClass() { count++; }
    ~MyClass() { count--; }
};

// 定义和初始化(类外,通常在.cpp文件中)
int MyClass::count = 0; 
 
 
3. 访问方式
 
// 通过类名访问(推荐)
MyClass::count;

// 通过对象访问(不推荐)
MyClass obj;
obj.count;
 
 
4. 特殊用法
 
- 类内常量:C++11 允许 static const 成员在类内初始化
class Constants {
public:
    static const int MAX_SIZE = 100;  // 类内初始化
};
 
 
二、static 成员函数
 
1. 基本特性
 
- 无 this 指针:不能访问非 static 成员
- 可直接调用:无需通过对象实例
- 常用作工具函数:与类相关但不依赖对象状态的函数
 
2. 定义与使用
 
class MathUtils

{
public:
    static double pi() { return 3.1415926; }
    
    static int add(int a, int b)

    {
        return a + b;
    }
};

// 调用方式
double circleArea = MathUtils::pi() * radius * radius;
int sum = MathUtils::add(5, 3);
 
 
3. 典型应用场景
 
1. 工厂方法:创建类实例
class Product

{
public:
    static Product* create()

    {
        return new Product();
    }
};
 
2. 单例模式:确保类只有一个实例
class Singleton

{
private:
    static Singleton* instance;
    Singleton() {}
public:
    static Singleton* getInstance()

    {
        if(!instance)

        {
            instance = new Singleton();
        }
        return instance;
    }
};
Singleton* Singleton::instance = nullptr;
 
 
三、static 成员的初始化
 
1. 基本规则
 
- 非 const static 成员:必须在类外定义和初始化
- const static 成员:
- 整型或枚举类型:可在类内初始化
- 其他类型:仍需在类外定义(C++17 引入 inline static 简化此情况)
 
2. C++17 改进
 
C++17 引入 inline static 成员,允许在类内直接初始化非 const static 成员:
 
class Modern

{
public:
    inline static int value = 42;  // C++17
};
 
 
四、static 成员的线程安全
 
1. 潜在问题
 
- static 成员变量在多线程环境下需要保护
- static 局部变量(在函数内)的初始化是线程安全的(C++11起)
 
2. 解决方案
 
class Logger

{
private:
    static std::mutex mtx;
    static std::vector<std::string> logs;
public:
    static void addLog(const std::string& msg)      {
        std::lock_guard<std::mutex> lock(mtx);
        logs.push_back(msg);
    }
};
 
 
五、最佳实践
 
1. 命名约定:考虑为 static 成员添加前缀(如 s*)提高可读性
2. 访问控制:合理使用 public/protected/private
3. 避免滥用:只在真正需要共享数据或功能时使用
4. 线程安全:多线程环境下确保同步访问
5. 替代方案:考虑命名空间内的全局函数/变量是否更适合
 
static 成员是 C++ 中强大的工具,正确使用可以:
 
- 减少全局命名空间的污染
- 实现类相关的共享数据和功能
- 优化内存使用(避免每个对象都存储相同数据)

相关文章:

  • jQuery的removeClass(),一次删除多个class
  • 4.2 Prompt工程与任务建模:高效提示词设计与任务拆解方法
  • 【学习笔记】文件包含漏洞--相关习题
  • 全面解析 UGC 平台物品冷启动策略
  • 【Linux内核】内核中的中断管理
  • Activepieces - 开源自动化工具
  • 【动手学大模型开发】什么是大语言模型
  • 【阿里云大模型高级工程师ACP习题集】2.4 自动化评测答疑机器人的表现(⭐️⭐️⭐️ 重点章节!!!)
  • Java Collections工具类指南
  • 计算机组成与体系结构:直接内存映射(Direct Memory Mapping)
  • Spring Boot YML配置值“011“在代码中变为9的问题解析
  • leetcode 2799. 统计完全子数组的数目 中等
  • 玩转Docker | Docker部署LMS轻量级音乐工具
  • 加深对vector理解OJ题
  • MQTT 之 EMQX
  • pnpm install报错:此系统上禁止运行脚本
  • 电竞俱乐部护航点单小程序,和平地铁俱乐部点单系统,三角洲护航小程序,暗区突围俱乐部小程序
  • 1.7软考系统架构设计师:系统架构设计师概述 - 超简记忆要点、知识体系全解、考点深度解析、真题训练附答案及解析
  • 【LLM+Code】Github Copilot Agent/VsCode Agent 模式PromptTools详细解读
  • windows系统自定义powshell批处理脚本
  • 石磊当选河北秦皇岛市市长
  • 神舟二十号3名航天员顺利进驻中国空间站
  • 央行上海总部答澎湃:上海辖内金融机构已审批通过股票回购增持贷款项目117个
  • 《亡命驾驶》:一场对于男子气概的终极幻想
  • 宁德时代与广汽等五车企发布10款巧克力换电新车型:年内将将完成30城1000站计划
  • 夜读丨一条鱼的使命