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

C++——静态成员

目录

静态成员的定义

静态成员变量

编程示例

存在的意义

静态成员函数

类内声明

类外定义

编程示例


静态成员的定义

静态成员在C++类中是一个重要的概念,它包括静态成员变量静态成员函数。静态成员的特点和存在的意义如下:

静态成员变量

1. 定义

  • 共享性:类的所有对象都能访问并修改静态成员变量,这使得对象之间能够进行数据共享。
  • 唯一性:无论创建了多少个类的实例(对象),静态成员变量仅有一份拷贝。这意味着对静态成员变量的修改会影响到所有对象。
  • 类内声明(声明但不分配内存)

    class MyClass {
    public:
        static int staticValue;  // 声明静态成员变量(类内)
        // 其他成员...
    };

2. 初始化:静态成员变量需要在类外进行初始化,通常在类的实现文件中。

  • 类外定义(分配内存并初始化)
    int MyClass::staticVar = 42;  // 在类外定义并初始化(通常在.cpp文件)

3. 访问:静态成员变量可以通过类名直接访问,不需要创建类的对象。也可以通过类的对象访问。

  • 通过类名直接访问静态成员变量,例:MyClass::staticValue
    •  MyClass(类名)+ ::(双冒号)+ (staticValue)静态变量名
  • 通过类的对象访问静态成员变量,例:m1.staticValue
    • m1(对象)+ .(运算符)+ (staticValue)静态变量名

4. 用途:常用于存储类级别的信息(例如,计数类的实例数量)或全局数据需要被类的所有实例共享。

编程示例

#include <iostream>

using namespace std;

class MyClass
{
public: // 公有权限
    static int staticValue; // 声明一个静态成员变量

    void setStaticValue(int data); // 声明一个普通变量成员函数
};

// 类外初始化静态成员变量
int MyClass::staticValue = 0;

// 类外定义普通成员函数 setStaticValue 
void MyClass::setStaticValue(int data)
{
    staticValue += data; // 修改静态成员变量的值
}

int main()
{
    cout << "使用类名直接访问静态成员变量:" << MyClass::staticValue << endl << endl;

    // 定义两个对象
    MyClass m1,m2;

    // 两个对象输出的结果都是:0
    // m1、m2对象都能访问到静态变量 staticValue 说明静态变量是共享的
    // 以下通过类名访问静态成员变量
    cout << "m1对象访问静态成员变量的值:" << m1.staticValue << endl;
    cout << "m2对象访问静态成员变量的值:" << m2.staticValue << endl<< endl;


    // 不管有多少个对象,静态变量只有一份拷贝,表示静态成员变量的唯一性
    // 如果其中一个对象,对静态变量进行修改,都会影响到所有对象当问静态变量的结果
    cout << "m1对象修改静态变量的值由0改为1" << endl<< endl;
    m1.setStaticValue(1);
    cout << "m1对象访问静态成员变量的值:" << m1.staticValue << endl;
    cout << "m2对象访问静态成员变量的值:" << m2.staticValue << endl;

    return 0;
}

存在的意义

共享数据:允许对象之间共享数据,而不需要每个对象都有一份拷贝。

节省内存:对于频繁使用的类,使用静态成员可以节省内存。

独立于对象的功能:静态成员函数提供了一种在不创建对象的情况下执行操作的方法,这对于实现工具函数或管理类级别状态很有用。

静态成员函数

1. 定义:静态成员函数是可以不依赖于类的实例(对象)而被调用的函数。它不能访问类的非静态成员变量和非静态成员函数

  • 类内声明

    在类声明中使用 static 关键字修饰函数:

    class MyClass {
    public:
        static void staticFunction();  // 声明静态成员函数
    };
  •  类外定义

    在类外部定义函数实现时不需要重复 static 关键字:

    void MyClass::staticFunction() {
        // 函数实现
        std::cout << "静态成员函数被调用" << std::endl;
    }

2. 访问:类似于静态成员变量,静态成员函数可以通过类名直接调用,也可以通过类的实例(对象)调用。

  • 通过类名直接调用,例:MyClass::getStaticValueNumFunc()
  • 通过对象直接调用,例:m1.getStaticValueNumFunc()

3. 用途:常用于实现与具体对象无关的功能,或访问静态成员变量。

编程示例

#include <iostream>

using namespace std;

class MyClass
{
private: // 私有权限
    static int staticValueNum; // 声明静态成员变量
public: // 公有权限
    static int getStaticValueNumFunc();

    MyClass() // 构造函数
    {
        staticValueNum++;
    }
    ~MyClass() //析构函数
    {
        staticValueNum--;
    }
};

// 在类外初始化静态变量
int MyClass::staticValueNum = 0;

// 在类外定义静态函数
int MyClass::getStaticValueNumFunc()
{
    return staticValueNum;
}

int main()
{
    cout << "通过类名访问静态成员函数:" << MyClass::getStaticValueNumFunc() << endl;

    // 创建对象
    MyClass m1;
    cout << "通过对象访问静态成员函数:" << m1.getStaticValueNumFunc() << endl;


    return 0;
}

http://www.dtcms.com/a/115567.html

相关文章:

  • flutter 专题 六十八 Flutter 多图片上传
  • C++:函数
  • AF3 OpenFoldDataLoader类解读
  • PostgreSQL 一文从安装到入门掌握基本应用开发能力!
  • 【C++】--- string的使用
  • go游戏后端开发24:写完赢三张游戏
  • C++中如何使用STL中的list定义一个双向链表,并且实现增、删、改、查操作
  • #SVA语法滴水穿石# (012)关于 first_match、throughout、within 的用法
  • 华为交换机配置指南:基础到高级命令详解
  • 51单片机使用定时器实现LCD1602的时间显示(STC89C52RC)
  • 迭代器运算详解(四十二)
  • OSI模型中协议数据单元(PDU)
  • 21 天 Python 计划:MySQL库相关操作
  • 深信服护网蓝初面试题
  • TYUTJava阶段测试
  • Spring 概念
  • 初探:简道云系统架构及原理
  • 定时器的实现方案:红黑树、最小堆与时间轮
  • 【蓝桥杯速成】日期问题(填空题) + 真题讲解 python
  • POSIX线程库
  • 程序化广告行业(65/89):AdX/SSP系统深度剖析与实战要点
  • 《操作系统真象还原》第五章(3)——载入内核
  • JAVA学习-练习试用Java实现“实现一个Hadoop MapReduce任务,对大数据集中的数值进行排序和筛选”
  • 23种设计模式-行为型模式-中介者
  • 可以使用费曼学习法阅读重要的书籍
  • 【学Rust写CAD】34 精确 Alpha 混合函数(argb.rs补充方法)
  • 路由器的 WAN(广域网)口 和 LAN(局域网)口
  • 【微机及接口技术】- 第五章 输入输出与接口技术(下)
  • uniapp微信小程序引入vant组件库
  • docker部署rabbitmq