【C++深度解析】16、类的静态成员

2023-05-16

文章目录

    • 1 静态成员变量
    • 2 静态成员函数
    • 3 小结

1 静态成员变量

  • 静态成员变量属于整个类,所有对象共享类的静态成员变量
  • 可直接通过对象名、类名访问
  • 静态成员变量的生命期不依赖于任何对象

特性:

  • 静态成员变量需要在类外单独分配空间,位于全局数据区

我们现在有这样一个需求,不使用全局变量的情况下,统计某个类的对象数目。

// 16-1.cpp
#include<stdio.h>
class Test
{
public:
    Test()
    {
        count++;
    }
    ~Test()
    {
        count--;
    }
    int getCount()
    {
        return count;
    }
private:
    static int count;		// 静态成员
};
int Test::count = 0;		// 类外分配空间
Test gTest;
int main()
{
    Test t1;
    Test t2;
    printf("count = %d\n", gTest.getCount());
    printf("count = %d\n", t1.getCount());
    printf("count = %d\n", t2.getCount());
    return 0;
}

静态成员函数不属于对象,属于整个类,每生成一个对象,构造函数对 count 加 1,每析构一个对象,析构函数对 count 减 1。

编译运行:

$ g++ 16-1.cpp -o 16-1
$ ./16-1
count = 3
count = 3
count = 3

2 静态成员函数

  • 静态成员函数属于整个类所有
  • 可以通过类名、对象名访问公有静态成员函数

静态成员函数直接通过 static 关键字修饰

静态成员函数和普通成员函数对比

静态成员函数普通成员函数
所有对象共享YesYes
隐含this指针NoYes
访问普通成员变量(函数)NoYes
访问静态成员变量(函数)YesYes
通过类名直接调用YesNo
通过对象名直接调用YesYes

静态成员函数不属于对象,属于整个类所有,所以自然没有 this 指针,普通成员变量属于某个对象,所以静态成员函数也不能访问普通成员函数。

上面的代码 16-1.cpp 当对象数量为 0 时,就不让统计对象数目。下面用静态成员函数就行修改。

// 16-1.cpp
#include<stdio.h>
class Test
{
public:
    Test()
    {
        count++;
    }
    ~Test()
    {
        count--;
    }
    static int getCount()
    {
        return count;
    }
private:
    static int count;
};
int Test::count = 0;
int main()
{
    printf("count = %d\n", Test::getCount());		// 可用类名直接访问
    Test t1;
    Test* pt = new Test();
    printf("count = %d\n", pt->getCount());
    delete pt;
    return 0;
}

这样即便是没有创建对象的时候也可以通过类名调用静态成员函数,得到对象数量为 0。

$ g++ 16-2.cpp -o 16-2
$ ./16-2
count = 0
count = 2

3 小结

1、静态成员变量属于类所有,在全局数据区分配空间,生命期为程序运行期
1、静态成员函数没有 this 指针,只能访问静态成员变量
2、静态成员函数可通过类名、对象名访问

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++深度解析】16、类的静态成员 的相关文章

  • 将MyEclipse的配色方案还原到最初的状态(主题还原)

    我的MyEclipse中导入了主题 xff0c 但是现在不想用那种花花绿绿的配色了 xff08 眼睛有点累 xff09 但是想还原却比较麻烦 xff0c 目前有三种方法吧 xff1a 1 xff1a 更换workspace 这种方法需要你重
  • 自己写的一个数组与list转化工具,请大神指正问题

    话不多说上代码 public class ListUtil public static void main String args List lt Integer gt lst1 61 new ArrayList lt Integer gt
  • Python学习记录-----批量发送post请求

    昨天学了一天的Python xff08 我的生产语言是java xff0c 也可以写一些shell脚本 xff0c 算有一点点基础 xff09 xff0c 今天有一个应用场景 xff0c 就正好练手了 这个功能之前再java里写过 xff0
  • 找不到系统安全日志/var/log/secure文件的问题

    今天打算配置一个服务器防止暴力破解的脚本 xff0c 原理不复杂 xff0c 搜索登录错误超过一定次数的ip地址 xff0c 加入防火墙 xff0c 但是在找登录日志的时候出现了问题 一般服务器的ssh登录等操作日志都是 var log s
  • osx多用户设置共享文件夹(MacBook)

    mac平台有很方便的多用户系统 xff08 Unix你懂的 xff09 我本人就一直在使用两个账户 xff0c 各有分工 xff0c 权限不同 有时候我们在一个账户下下载或者使用的文件 xff0c 也需要在另一个账户上使用 xff0c 这就
  • MySQL DROP TABLE操作以及 DROP 大表时的注意事项

    语法 xff1a 删表 sql view plain copy DROP TABLE Syntax DROP TEMPORARY TABLE IF EXISTS tbl name tbl name RESTRICT CASCADE 可一次删
  • python日期操作类

    coding utf 8 39 39 39 获取当前日期前后N天或N月的日期 39 39 39 from time import strftime localtime from datetime import timedelta date
  • ROS运行调用摄像头无法显示的解决办法

    报错 xff1a Unable to open camera calibration file home hri ros camera info head camera yaml 参考 xff1a https github com ros
  • [VC] 冒号(:)与C/C++

    这篇文章将总结C C 43 43 中的冒号的用法 1 位域定义 是C 43 43 里的 作用域分解运算符 比如声明了一个类A xff0c 类A里声明了一个成员函数voidf xff0c 但没有在类的声明里给出f的定义 xff0c 那么在类外
  • TX2入门(1)——开箱上电

    因为实验室有需求 导师购入了一块Jetson TX2开发板 下面就记录一下板子在我手机的应用过程 xff0c 方便以后查找 xff0c 如果也能给大家一些帮助就更好啦 欢迎转载 1 已经提前按照网上各种大神的意见采购好了电源线 HDMI转V
  • TX2入门(3)——ubuntu(包含tx2端)常用命令(持续补充中……)

    emmm xff0c 刷机完成 xff0c 突然发现还有一些常用指令需要整理一下 xff0c 以后查找起来方便 所以 xff0c tensorflow放到下一篇吧 一 系统架构类型 1 查看系统架构 uname a 2 显示操作系统架构类型
  • 使用 sphinx 制作简洁而又美观的文档

    Sphinx 是一种工具 xff0c 它允许开发人员以纯文本格式编写文档 xff0c 以便采用满足不同需求的格式轻松生成输出 这在使用 Version Control System 追踪变更时非常有用 纯文本文档对不同系统之间的协作者也非常
  • 关于C语言的空格符和字符串结束符

    空格 39 39 和结束符 39 0 39 是不一样的 xff0c 但是如果用scanf函数 s的格式输入 xff0c 遇到空格符就会当成结束符
  • 查看Jetson系列产品JetPack的版本信息

    想查看 JetPack 的版本信息 xff0c 网上搜了一下都是要查看 etc nv tegra release 也没说该怎么看和什么意思 图片链接 https www jianshu com p 7f2d8a563ded 查了一下 xff
  • docker run 参数详解

    命令格式 xff1a docker run OPTIONS IMAGE COMMAND ARG Usage Run a command in a new container 中文意思为 xff1a 通过run命令创建一个新的容器 xff08
  • Docker安装Minio

    寻找Minio镜像 Docker Hub 查找官方镜像 下载Minio镜像 下载最新版Minio镜像 span class token function docker span pull minio minio 等同于 span class
  • Docker安装Nginx

    寻找Nginx镜像 Docker Hub 查找官方镜像 下载Nginx镜像 下载最新版Nginx镜像 span class token function docker span pull nginx 等同于 span class token
  • Docker安装pgAdmin4

    寻找Redis镜像 Docker Hub 查找官方镜像 下载Redis镜像 下载最新版pgAdmin4镜像 span class token function docker span pull dpage pgadmin4 等同于 span
  • SQLServer跨库查询--分布式查询 用openrowset连接远程SQL或插入数据

    如果只是临时访问 可以直接用openrowset 查询示例 select from openrowset SQLOLEDB sql服务器名 用户名 密码 数据库名 dbo 表名 导入示例 select into 表 from openrow
  • ubuntu20 编译dpdk错误 -Werror=address-of-packed-member

    0x0 在ubuntu20上编译dpdk 18 11报错 xff0c gcc 版本为9 3 0 xff0c 报错如下 xff1a error converting a packed const struct ether addr point

随机推荐

  • Docker安装EMQX

    寻找EMQX镜像 Docker Hub 查找官方镜像 下载EMQX镜像 下载最新版EMQX镜像 span class token function docker span pull emqx emqx 等同于 span class toke
  • Aspose.Cells中文版文档

    Aspose Cells相应操作 1 上传 1 1 Workbook Workbook workBook 61 new Workbook 属性 名称 值类型 说明 Colors Color 获取或设置Excel颜色 ConvertNumer
  • expdp/impdp 详细参数解释

    数据泵导出实用程序提供了一种用于在 Oracle 数据库之间传输 数据对象的机制 该实用程序可以使用以下命令进行调用 示例 expdp scott tiger DIRECTORY 61 dmpdir DUMPFILE 61 scott dm
  • MSDN,我告诉你

    VS MSSQL Windows Windows Server等下载地址均为电骡下载地址 http msdn itellyou cn
  • ASP.NET MVC 4 插件化架构简单实现-思路篇

    用过和做过插件的都会了解插件的好处 xff0c 园子里也有很多和讨论 xff0c 但大都只些简单的加载程序集什么的 xff0c 这里主要讨论的就是使用 ASP NET MVC 4 来实现每个插件都可以完全从主站点剥离出来 xff0c 即使只
  • Quartz.NET 2.0 学习笔记(4) :cron表达式

    Quartz NET 项目地址 http quartznet sourceforge net Quartz NET 2 0 学习笔记 1 xff1a Quartz NET简介 Quartz NET 2 0 学习笔记 2 xff1a 和1 0
  • 修改oracle用户密码永不过期

    1 以在SQL Plus下以DBA身份登陆 用户名 密码 64 服务器SID as sysdba 方法一 xff1a xff08 注意必须用双引号把后面的引上 xff09 C Documents and Settings ssy gt sq
  • Log4Net记录日志到数据库启动24小时后将无法向mysql数据库插入数据

    最近用Log4Net做成服务把日志记录到MySql数据库可是发现可以个奇怪的的问题 xff0c 每过一个晚上Log4Net就不会自动向MySql 数据库记录日志 xff0c 后来经过多方面测试发现 这个问题主要是Mysql会把空闲8小时 x
  • Mysql 密码过期导致无法登陆

    1 停止当前mysql服务 2 mysqld defaults file 61 34 C ProgramData MySQL MySQL Server 5 7 my ini 34 skip grant tables 一定是my ini 我一
  • 上拉电阻 以及 阻抗匹配

    如上图 xff0c 这是UART通信部分原理图 xff0c 先分析一下TX0部分的电路 xff0c 图上TX0是从芯片直接引出来 xff0c 左边四PIN的J7是接到外部设备的插针 xff0c 当TX0输出低电平时 xff0c 由于D2阳极
  • 计算机网络实践

    计算机网络实践 第一章 计算机基本命令 一 网线制作 材料 xff1a 双绞线 xff08 8根线两两绞在一起为减弱电磁干扰 xff09 xff1b 水晶头 xff1b 压线钳双绞线测试仪 制作过程 xff1a 用压线钳将双绞线一端的灰色表
  • 1.FreeRTOS操作系统简介

    1 1 FreeRTOS是什么 xff1f 操作系统 xff08 operation system 简称OS xff09 xff1a 是管理计算机硬件和软件资源的计算机程序 实时操作系统 xff08 Real Time Operating
  • ROS运行python脚本报错ImportError: No module named srv

    最近又写了个ROS xff08 robot operating system xff09 包 xff0c 格式照抄之前的包 xff0c 结构如下 xff1a haipeng 64 wang catkin ws src tree net ma
  • Git如何修改commit信息

    一 git 如何修改最近一次的commit信息 1 git commit amend 2 进入vim操作界面之后 点击字母键 i 然后进入INSERT模式 xff0c 然后对commit信息进行修改 xff0c 然后ESC 然后 wq 保存
  • vscode下git的常见操作

    目录 一 第一次从git下载代码 xff0c 前期流程 二 输入相关命令 xff1a 2 1 下载master分支代码 xff1a 2 2 下载dev分支的代码 2 3 服务器新建了新的分支 xff0c 本地刷新分支 一 第一次从git下载
  • ubuntu配置novnc通过web访问服务器

    希望通过vnc去连接主机去看控制服务器系统 xff0c 集成到web中使用 novnc是一种选择 环境如下 xff0c 两个主机host1 host2 xff0c web装载81 224中 xff0c 环境使用的Ubuntu 16 04 具
  • 简单的命令快速下载远程各种docker 镜像 github 库,各种软件资料。

    做研究开发和项目实战中经常要下载国外的docker镜像和软件源代码 xff0c 软件安装包 xff0c 这个过程如果子国外的服务器上执行 xff0c 一般不会超过10秒 xff0c 如果在中国境内的机器上执行 xff0c 一般要5分钟甚至几
  • 字节序(byte order)、比特序(bit order)、MSB/LSB、大端模式/小端模式 概念误混淆

    发现之前概念一直混淆 xff0c 今天就理清楚以作备忘 前提 xff1a 内存的读写永远从低地址开始读 写 xff0c 从低到高 xff01 从低到高 xff01 从低到高 xff01 内存的读写永远从低地址开始读 写 xff01 xff0
  • 蓝牙协议栈(六、芯片组)

    在本章中 xff0c 我们首先解释蓝牙芯片组如何物理连接 xff0c 然后提供有关流行的蓝牙芯片组及其与BTstack一起使用的信息 HCI接口 主机 xff08 计算机或MCU xff09 与主机控制器 xff08 实际蓝牙芯片组 xff
  • 【C++深度解析】16、类的静态成员

    文章目录 1 静态成员变量2 静态成员函数3 小结 1 静态成员变量 静态成员变量属于整个类 xff0c 所有对象共享类的静态成员变量可直接通过对象名 类名访问静态成员变量的生命期不依赖于任何对象 特性 xff1a 静态成员变量需要在类外单