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

C++(18)—类和对象(下) ③static成员

文章目录

  • 一、静态成员的概念与特性
  • 二、静态成员变量的定义与使用
    • 1. 定义规则
    • 2. 使用场景
  • 三、静态成员函数的特性与限制
    • 1. 核心特点
    • 2. 使用示例
  • 四、静态成员与普通成员的对比
  • 五、静态成员的应用场景
  • 六、最佳实践与注意事项
  • 七、总结

一、静态成员的概念与特性

在C++中,static关键字用于修饰类的成员变量和成员函数,使其成为静态成员。静态成员与类的实例无关,而是属于类本身。其核心特性如下:
在这里插入图片描述

二、静态成员变量的定义与使用

1. 定义规则

声明:在类内用static关键字声明。

初始化:必须在类外单独初始化,且不带static关键字。
class A {
private:
    static int _count;  // 类内声明
};

int A::_count = 0;      // 类外初始化(必须!)

2. 使用场景

资源共享:例如全局计数器、共享缓存。

对象计数:统计程序中创建的对象数量。
#include <iostream>
using namespace std;

class A {
public:
    A() { ++_count; }          // 构造函数:计数+1
    A(const A&) { ++_count; }  // 拷贝构造:计数+1
    ~A() { --_count; }         // 析构函数:计数-1

    static int GetCount() { return _count; }

private:
    static int _count;  // 静态成员变量声明
};

int A::_count = 0;      // 类外初始化

int main() {
    A a1;               // 计数=1
    A a2 = a1;          // 计数=2
    {
        A a3;           // 计数=3
    }                   // 离开作用域,计数=2
    cout << A::GetCount();  // 输出:2
    return 0;
}

三、静态成员函数的特性与限制

1. 核心特点

无this指针:无法直接访问类的非静态成员。

访问权限:只能访问静态成员变量和函数。

调用方式:可通过类名或对象调用。

2. 使用示例

class Logger {
public:
    static void Log(const string& msg) {
        // 只能访问静态成员
        _logCount++;
        cout << "[" << _logCount << "] " << msg << endl;
    }

private:
    static int _logCount;  // 静态成员变量
};

int Logger::_logCount = 0;

int main() {
    Logger::Log("Start program");  // 输出:[1] Start program
    Logger logger;
    logger.Log("Initialized");     // 输出:[2] Initialized
    return 0;
}

四、静态成员与普通成员的对比

在这里插入图片描述

五、静态成员的应用场景

全局计数器:统计对象实例数量(如示例代码)。

资源共享:例如数据库连接池、线程池。

工具类函数:提供与类相关但不依赖对象状态的工具方法(如数学计算函数)。

单例模式:通过静态成员实现单例对象的唯一性。

六、最佳实践与注意事项

初始化位置:静态成员变量必须在类外初始化,否则会导致链接错误。

线程安全:多线程环境下,静态成员的访问需加锁保护。

避免滥用:过度使用静态成员可能导致代码耦合度高,难以维护。

C++17内联静态成员:C++17支持在类内直接初始化静态成员(需inline关键字):
class Example {
public:
    inline static int _count = 0;  // C++17特性
};

七、总结

静态成员是C++中实现类级别数据共享和功能封装的重要工具。理解其初始化规则、访问限制及适用场景,能够帮助开发者编写出更高效、健壮的代码。合理使用静态成员,可以简化设计模式(如单例模式)的实现,提升程序的可维护性。

相关文章:

  • 再看自适应RAG方法:SEAKR|PIKE-RAG|DeepRAG
  • skynet.dispatch可用的已注册的协议类型
  • 前端开发中的单引号(‘ ‘)、双引号( )和反引号( `)使用
  • 【AIGC】零样本学习方法综述(TPAMI 2023 研究综述)
  • java面向对象练习
  • Linux进程控制(五)之做一个简易的shell
  • 玄机靶场:apache日志分析
  • 4.7-python request库的基本使用
  • 【区块链安全 | 第三十三篇】备忘单
  • 其它理论原则
  • 从存储仓库到智能中枢:AI时代NAS的进化革命
  • Android使用声网SDK实现音视频互动(RTC)功能
  • 【算法应用】基于融合A星-粒子群算法求解六边形栅格地图路径规划
  • 分行经理个人简历
  • scala课后总结(7)
  • 虚引用软引用强引用弱引用
  • 多模态大语言模型arxiv论文略读(四)
  • 【Django】教程-11-ajax弹窗实现增删改查
  • WSL2迁移教程:如何备份和转移Ubuntu子系统到新位置
  • [C++面试] C++中各类括号的差异:[]、{}、<>、()
  • 集团网站建设公司/关键词搜索爱站网
  • php网站做cdn/今日新闻头条大事
  • 网站栏目做ip地址访问限制/优秀的软文广告欣赏
  • wordpress 设置显示中文/广州网站优化服务商
  • 做网站导航按钮怎么猛/引擎搜索大全
  • 网站管理员工作总结/抖音seo排名系统