C++ 基础

C++ 主页 C++ 概述 C++ 环境设置 C++ 基本语法 C++ 注释 C++ Hello World C++ 省略命名空间 C++ 标记 C++ 常量/字面量 C++ 关键字 C++ 标识符 C++ 数据类型 C++ 数字数据类型 C++ 字符数据类型 C++ 布尔数据类型 C++ 变量类型 C++ 变量作用域 C++ 多变量 C++ 基本输入/输出 C++ 修饰符类型 C++ 存储类 C++ 数字 C++ 枚举 C++ 枚举类 C++ 引用 C++ 日期和时间

C++ 运算符

C++ 运算符 C++ 算术运算符 C++ 关系运算符 C++ 逻辑运算符 C++ 位运算符 C++ 赋值运算符 C++ sizeof 运算符 C++ 条件运算符 C++ 逗号运算符 C++ 成员运算符 C++ 强制类型转换运算符 C++ 指针运算符 C++ 运算符优先级 C++ 一元运算符

C++ 控制语句

C++ 决策语句 C++ if 语句 C++ if else 语句 C++ 嵌套 if 语句 C++ switch 语句 C++ 嵌套 switch语句 C++ 循环类型 C++ while 循环 C++ for 循环 C++ do while 循环 C++ Foreach 循环 C++ 嵌套循环 C++ break 语句 C++ continue 语句 C++ goto 语句

C++ 字符串

C++ 字符串 C++ 循环遍历字符串 C++ 字符串长度 C++ 字符串连接 C++ 字符串比较

C++ 函数

C++ 函数 C++ 多函数参数 C++ 递归函数 C++ 返回值 C++ 函数重载 C++ 函数重写 C++ 默认参数

C++ 数组

C++ 数组 C++ 多维数组 C++ 指向数组的指针 C++ 将数组传递给函数 C++ 从函数返回数组

C++ 结构 &联合

C++ 结构 C++ 联合

C++ 指针

C++ 指针 C++ 解引用 C++ 修改指针

C++ 类和对象

C++ 面向对象 C++ 类 &对象 C++ 类成员函数 C++ 类访问修饰符 C++ 静态类成员 C++ 静态数据成员 C++ 静态成员函数 C++ 内联函数 C++ this 指针 C++ 友元函数 C++ 指向类的指针

C++ 构造函数

C++ 构造函数 &析构函数 C++ 默认构造函数 C++ 参数化构造函数 C++ 复制构造函数 C++ 构造函数重载 C++ 带默认参数的构造函数 C++ 委托构造函数 C++ 构造函数初始化列表 C++ 使用构造函数动态初始化

C++ 继承

C++ 继承 C++ 多重继承 C++ 多级继承

C++ 面向对象

C++ 重载 C++ 多态性 C++ 抽象 C++ 封装 C++ 接口 C++ 虚函数 C++ 纯虚函数与抽象类

C++ 文件处理

C++ 文件和流 C++ 文件读取

C++ 进阶

C++ 异常处理 C++ 动态内存 C++ 命名空间 C++ 模板 C++ 预处理器 C++ 信号处理 C++ 多线程 C++ Web 编程 C++ 套接字编程 C++ 并发 C++ 高级概念 C++ Lambda 表达式 C++ unordered_multiset

C++ 实用资源

C++ 问答 C++ 快速指南 C++ 速查表 C++ STL 教程 C++ 标准库 C++ 实用资源 C++ 讨论


C++ 中的静态数据成员

C++ 中的静态数据成员

在 C++ 中,静态数据成员是类成员类级变量,由该的所有实例(对象)共享。这与常规数据成员不同,常规数据成员为每个类对象提供单独的副本。静态数据成员在整个类中只有一个副本,并且可以在所有实例之间共享,这意味着类的所有对象都可以访问和修改相同的值。

静态数据成员声明

以下语法用于在类中使用static 关键字声明静态数据成员。

class ClassName {
   public:
     static dataType staticMemberName; 
};

静态数据成员初始化

以下语法用于在类外部定义和初始化静态数据成员,使用 ClassName:: 作用域解析运算符完成。

dataType ClassName::staticMemberName = initialValue;

访问静态数据成员

静态数据成员可以通过两种方式访问​​,即:-

  • 使用类名(推荐)
  • 使用对象(不推荐)

下面我们将了解它们之间的区别以及它们的语法和示例。

使用类名访问静态数据成员

这是访问静态数据成员非常常见且首选的方式,即使用作用域解析运算符 ::

语法

其语法如下。

ClassName::staticDataMember;

使用对象访问静态数据成员

您也可以使用对象访问静态数据成员,但通常不建议这样做,因为静态成员独立于任何特定对象,使用对象可能会产生误导。

语法

其语法如下。

objectName.staticDataMember;

示例

以下是 C++ 中静态数据成员的示例。

#include <iostream>
#include <string>
using namespace std;

class Book {
    private:
        string title; // 书名
        string author; // 书的作者
    public:
        // 静态数据成员,用于跟踪图书馆的图书总数
        static int totalBooks;
    
    // 构造函数,用于初始化图书的标题和作者
    Book(string bookTitle, string bookAuthor) {
        title = bookTitle;
        author = bookAuthor;
        totalBooks++;
        // 每次创建新图书时,totalBooks 值递增
    }
    
    // 静态方法,用于显示图书总数
   static void displayTotalBooks() {
      cout << "Total number of books in the library: " << totalBooks << endl;
   }

   // 显示书籍信息的方法
   void displayBookInfo() {
      cout << "Book Title: " << title << ", Author: " << author << endl;
   }
};

// 在类外初始化静态数据成员
int Book::totalBooks = 0;

int main() {

    // 创建书籍对象(添加到图书馆的书籍)
    Book book1("The Catcher in the Rye", "J.D. Salinger");
    Book book2("To Kill a Mockingbird", "Harper Lee");
    Book book3("1984", "George Orwell");
    
    // 使用静态方法显示图书总数
    Book::displayTotalBooks();
    
    // 显示每本书的详细信息
    book1.displayBookInfo();
    book2.displayBookInfo();
    book3.displayBookInfo();
    
    // 向图书馆添加更多图书
    Book book4("Pride and Prejudice", "Jane Austen");
    Book book5("The Great Gatsby", "F. Scott Fitzgerald");
    
    // 显示更新后的书籍总数
    Book::displayTotalBooks();
    
    return 0;
}

输出

Total number of books in the library: 3
Book Title: The Catcher in the Rye, Author: J.D. Salinger
Book Title: To Kill a Mockingbird, Author: Harper Lee
Book Title: 1984, Author: George Orwell
Total number of books in the library: 5

静态数据成员的用例

C++ 中的静态数据成员是指那些可以被类的所有实例访问的变量的名称。也就是说,它们不与任何对象绑定。让我们来看看它的一些常见用例。

1. 跟踪对象创建

静态数据成员的一个非常常见的用途是跟踪类的实例或对象的数量。

2. 维护全局配置或设置

这些用于创建全局设置或配置组件,这些组件需要在任何上下文中被类的所有实例访问。

3. 缓存或共享资源管理

静态数据成员还可用于管理系统中的共享资源或缓存,在这种情况下,多个对象可能会访问同一资源。

4.实现像单例这样的设计模式

实现像单例这样的设计模式也非常有利,因为这种模式通常使用静态数据成员来确保整个程序中只有一个类的实例。静态成员保存的是该类的唯一实例。

5. 跨对象跟踪全局计数器或操作

它还有助于跟踪特定对象或操作的全局计数,例如统计登录次数、交易次数或事件次数。