c++——静态成员变量、静态成员函数和const修饰的静态成员变量

news2025/1/16 11:00:59

一、c++静态成员变量

在C++中,静态成员变量(Static Member Variable)是类的一种特殊类型的成员变量,它被类的所有实例共享,而不是每个实例都有自己的副本。静态成员变量在类的所有对象之间保持唯一的状态,具有一些特殊的用途和语法。

1、概念:

静态成员变量是类的成员变量,但不是依赖于类的实例而存在的。它在类的所有实例之间共享相同的内存位置,因此在类的所有对象之间保持唯一的状态。
静态成员变量在类的声明中使用static关键字来定义,并在类的实现文件中进行初始化换句话说就是不能在类中进行初始化)。

2、使用方法:

①、声明静态成员变量:
在类的声明中,使用static关键字声明静态成员变量。声明通常在类的public、private或protected部分。

②、初始化静态成员变量:(不能在类里面进行初始化)
静态成员变量需要在类的实现文件中进行初始化。在类外部,使用类名和作用域解析操作符::来初始化静态成员变量。

③、访问静态成员变量:
静态成员变量不属于类的实例,因此可以使用类名和作用域解析操作符来访问,也可以在类的成员函数中通过this指针访问。

案例:

#include <iostream>
using namespace std;
class MyClass {
   public:
    /*
     *声明静态成员变量
     *静态成员变量在编译阶段就已经分配了内存,存在全局静态区
     */
    static int staticVar;

    MyClass() {
        // 在构造函数中修改静态成员变量
        staticVar++;
    }

    // 静态成员函数,用于访问静态成员变量
    static void printStaticVar() {
        cout << "Static variable value: " << staticVar << endl;
    }
};

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

int main() {
    MyClass obj1;
    MyClass::printStaticVar();  // 访问静态成员变量

    MyClass obj2;
    MyClass::printStaticVar();  // 访问静态成员变量

    return 0;
}

3、总结

在这里插入图片描述
①静态成员变量在内存中只有一份,多个对象共享一个静态变量
②静态成员变量,必须类内声明,类外定义
③静态成员变量可以通过类的作用域访问
④静态成员变量可以通过类的对象访问

二、静态成员函数

1、概念:

静态成员函数(Static Member Function):
静态成员函数是不依赖于类的实例的成员函数。它们可以通过类名和作用域解析操作符::直接访问。静态成员函数不能访问非静态成员变量,也不能使用this指针。

2、特点:

①静态成员函数能访问静态成员变量不能访问普通的成员变量
②可以通过类的作用域访问静态成员函数
③可以通过对象访问静态成员函数

案例代码

#include <iostream>
using namespace std;
class MyClass {
   private:
    int regularVar;        // 普通成员变量
    static int staticVar;  // 静态成员变量

   public:
    MyClass(int regValue, int statValue) : regularVar(regValue) {
        staticVar = statValue;
    }

    static void staticFunction() {
        // 静态成员函数可以访问静态成员变量,但不能访问普通成员变量
        cout << "Static member function accessing staticVar: " << staticVar
             << endl;
        // 下面一行会引发编译错误,因为静态函数不能访问普通成员变量
        // cout << "Static member function accessing regularVar: " <<
        // regularVar << endl;
    }

    void regularFunction() {
        cout << "Regular member function accessing regularVar: " << regularVar
             << endl;
    }
};

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

int main() {
    // 使用类的作用域访问静态成员函数
    MyClass::staticFunction();

    MyClass obj(42, 100);
    obj.regularFunction();

    // 通过对象访问静态成员函数
    obj.staticFunction();  // 也可以通过对象访问,但是不推荐,最好使用类名访问

    return 0;
}

三、const修饰的静态成员变量

①const修饰的静态成员变量保存在常量区,只读的,在内存中只有一份
②const修饰的静态成员变量可以在类内定义且初始化
③const修饰的静态成员变量可以通过类的作用域访问
④const修饰的静态成员变量可以通过对象访问
⑤静态成员函数可以访问const修饰的静态成员变量

代码案例:

#include <iostream>
using namespace std;

class MyClass {
   public:
    // 在类内部定义且初始化带有const修饰的静态成员变量
    static const int staticConstVar = 42;

    static void printStaticConstVar() {
        // 静态成员函数可以访问const修饰的静态成员变量
        cout << "Static const variable value: " << staticConstVar << endl;
    }
};

int main() {
    // 通过类的作用域访问const修饰的静态成员变量
    cout << "Accessing via class scope: " << MyClass::staticConstVar << endl;

    // 通过对象访问const修饰的静态成员变量
    MyClass obj;
    cout << "Accessing via object: " << obj.staticConstVar << endl;

    // 调用静态成员函数,访问const修饰的静态成员变量
    MyClass::printStaticConstVar();

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/896723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElementPlusError 解决: [ElForm] model is required for validate to work 的三种方式

1、问题描述&#xff1a; 其一、报错为&#xff1a; ElementPlusError: [ElForm] model is required for validate to work. 中文为&#xff1a; ElementPlusError&#xff1a;验证工作需要 [ElForm] 模型 其二、问题描述为&#xff1a; 在 form 表单中需要进行规则校验&a…

分布式锁系列之Redis分布式锁

目录 介绍 模拟订单超卖场景 代码版 不加锁情况 synchronized加锁 ​编辑 lock加锁 整合Mysql版 不加锁版 synchronized加锁 lock加锁版 jvm加锁失效情况 多例模式 事务 集群搭建 书写sql解决集群超卖 使用悲观锁select ...for update ​编辑 不加悲观锁情况 使用…

备份或同步数据?跨国大文件传输的不同需求与解决方案

信息化时代的到来&#xff0c;使得许多个人、组织、企业在日常生活中都需要对数据进行备份或同步。但不同的应用场景和需求&#xff0c;也需要不同的备份和同步方式。而在跨国大文件传输方面&#xff0c;更是需要根据不同需求选择合适的传输方案。下面将分别介绍备份与同步数据…

第一章MyBatis概述

框架 Java常用框架 SSM三大框架&#xff1a;SpringSpringMVCMyBatisSpringBootSpringCloud 框架简单来说就是提前封装好的通用代码&#xff0c;提高我们的开发的效率&#xff08;站在巨人的肩膀上&#xff09; 框架一般以jar包的形式存在 三层架构 代码封装主要为了降低代…

MQTT 常用客户端库介绍 (全面涵盖c,c++,java,c#,python)

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的通信协议&#xff0c;被广泛应用于物联网和分布式系统中。它以其简单、可靠和高效的特性而备受推崇&#xff0c;成为连接设备和应用程序的首选协议。MQTT的重要性不言而喻&#xff0c;它为实时通…

K8S应用笔记 —— 签发自签名证书用于Ingress的https配置

一、需求描述 在本地签发自命名证书&#xff0c;用于K8S集群的Ingress的https配置。 前提条件&#xff1a; 完成K8S集群搭建。完成证书制作机器的openssl服务安装。 二、自签名证书制作 2.1 脚本及配置文件准备 2.1.1 CA.sh脚本准备 注意事项&#xff1a; openssl服务默认CA…

【vim 学习系列文章 5 - cscope 过滤掉某些目录】

文章目录 cscope 过滤目录介绍 cscope 过滤目录介绍 第一步创建自己的cscope脚本~/.local/bin/cscope.sh&#xff0c;如下&#xff1a; function my_cscope() {CODE_PATHpwdecho "$CODE_PATH"echo "start cscope...."if [ ! -f "$CODE_PATH/cscope.…

qt实现9×9数独游戏

qt实现的数独小游戏&#xff0c;资源有可下载直接跑的exe&#xff08;enigma已经打包好&#xff09;&#xff0c;源码可私信 部分代码 #include "widget.h" #include "ui_widget.h" #include"form.h" #include<QDebug> #include<QPush…

数据结构——二叉搜索树(附带C++实现版本)

文章目录 二叉搜索树概念 二叉树的实际应用二叉树模拟实现存储结构二叉搜索树构成二叉搜索树的查找插入操作中序遍历二叉树的删除循环(利用左子树最右节点&#xff09;递归(利用右子树根节点) 二叉树拷贝二叉树资源的销毁 二叉树实现完整代码总结 二叉搜索树 概念 二叉搜索树…

LVS-DR+keepalived实现高可用负载群集

VRRP 通信原理&#xff1a; VRRP就是虚拟路由冗余协议&#xff0c;它的出现就是为了解决静态路由的单点故障。 VRRP是通过一种竞选的一种协议机制&#xff0c;来将路由交给某台VRRP路由。 VRRP用IP多播的方式&#xff08;多播地址224.0.0.18&#xff09;来实现高可用的通信&…

opencv运动目标检测-背景建模

背景建模 帧差法 由于场景中的目标在运动&#xff0c;目标的影像在不同图像帧中的位置不同。该类算法对时间上连续的两帧图像进行差分运算&#xff0c;不同帧对应的像素点相减&#xff0c;判断灰度差的绝对值&#xff0c;当绝对值超过一定阈值时&#xff0c;即可判断为运动目…

Java虚拟机(JVM):垃圾收集算法

目录 一、分代收集理论 二、标记-清除算法 三、标记-复制算法 四、标记-整理算法 一、分代收集理论 分代收集理论建立在两个分代假说之上&#xff1a; 1、弱分代假说&#xff1a;绝大多数对象都是朝生夕灭的。 2、强分代假说&#xff1a;熬过越多次垃圾收集过程的对象就…

Python中数据结构列表详解

列表是最常用的 Python 数据类型&#xff0c;它用一个方括号内的逗号分隔值出现&#xff0c;列表的数据项不需要具有相同的类型。 列表中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。列表都可…

C语言之指针进阶篇(1)

目录​​​​​​​ 引言 字符指针 指针数组 数组指针 数组指针的定义 &数组名vs数组名 数组指针的使用 一维数组使用 二维数组使用 一维数组传参 二维数组传参 总结 数组参数 一维数组传参 二维数组传参 指针参数 一级指针传参 二级指针传参 引言 今…

Jmeter对websocket进行测试

JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar下载 公司使用websocket比较奇怪&#xff0c;需要带认证信息进行长连接&#xff0c;通过websocket插件是请求失败&#xff0c;如下图&#xff0c;后面通过代码实现随再打包jar包完成websocket测试 本地实现代码如下&#xff1a; pa…

总结,由于顺丰的问题,产生了电脑近期一个月死机问题集锦

由于我搬家&#xff0c;我妈搞顺丰发回家&#xff0c;但是没有检查有没有坏&#xff0c;并且我自己由于不可抗力因素&#xff0c;超过了索赔时间&#xff0c;反馈给顺丰客服&#xff0c;说超过了造成了无法索赔的情况&#xff0c;现在总结发生了损坏配件有几件&#xff0c;显卡…

Java 项目日志实例基础:Log4j

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ 介绍几个日志使用方面的基础知识。 1 Log4j 1、Log4j 介绍 Log4j&#xff08;log for java&#xff09;是 Apache 的一个开源项目&#xff0c;通过使用 Log4j&#xff0c;我…

奥威BI数据可视化工具:个性化定制,打造独特大屏

每个人都有自己独特的审美&#xff0c;因此即使是做可视化大屏&#xff0c;也有很多人希望做出不一样的报表&#xff0c;用以缓解审美疲劳的同时提高报表浏览效率。因此这也催生出了数据可视化工具的个性化可视化大屏制作需求。 奥威BI数据可视化工具&#xff1a;个性化定制&a…

nginx代理webSocket链接响应403

一、场景 使用nginx代理webSocket链接&#xff0c;nginx响应403 1、nginx访问日志响应403 [18/Aug/2023:09:56:36 0800] "GET /FS_WEB_ASS/webim_api/socket/message HTTP/1.1" 403 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit…

opencv-dnn

# utils_words.txt 标签文件 import osimage_types (".jpg", ".jpeg", ".png", ".bmp", ".tif", ".tiff")def list_images(basePath, containsNone):# return the set of files that are validreturn list_file…