C++类与对象之静态成员和静态成员函数

2023-05-16

C++面向对象编程中,静态成员也是较为重要的。

C++的变量存储区除了堆区和栈区之外,还存在静态存储区,用于存放static静态变量,全局变量以及常量,生命周期是从程序开始运行到结束。

下面分两个部分,静态成员和静态成员函数来讲解:

静态成员

  • 所有对象共享同一份数据。
  • 在编译阶段分配内存。
  • 类内声明,类外初始化。

那么何为类内声明,类外初始化呢?

//test.cpp 
#include <stdio.h> 
class A { 
    public: 
        static int a; //声明但未定义
 }; 
int main() { 
    printf("%d", A::a);
    return 0;
}

首先这里的初始化不是指定义变量或者赋值,而是分配内存空间,上述示例运行结果将会报错,原因就是静态变量没有类外初始化。我们再看下面一个例子

//test.cpp 
#include <stdio.h> 
class A { 
    public: 
        static int a; //声明但未定义
 }; 
int A::a; //定义了静态成员变量,同时初始化。也可以写"int A:a;",即不给初值,同样可以通过编译
int main() { 
    printf("%d", A::a);
    return 0;
}

这里即使不对A::a赋值,也能输出结果,因此这里的初始化,指分配内存,而不是赋值。

静态成员函数

  • 前面加上static。
  • 所有对象共享同一个函数。
  • 静态成员函数只能访问静态成员变量。
  • 静态成员函数类内类外均可实现

调用方法:

1、通过对象访问:类对象.函数(class.fun)

2、通过类名访问:类名::函数(class::fun)

这里同样要说明的是,为什么静态函数只能调用静态变量?

这需要结合上面的静态成员来解释

  • 首先,静态成员是所有对象共享,它不属于某个类的对象,在没有进行实例化时,静态成员变量就已经存在。
  • 其次,非静态成员必须在类的对象创建时才会分配内存。
  • 所以,静态成员函数是“看不见”非静态成员变量的。

C++会区分两种类型的成员函数:静态成员函数和非静态成员函数。这两者之间的一个重大区别是,静态成员函数是没有this指针的,且不接受隐含的this自变量,无法访问自己类的非静态成员。

使用静态成员的优点: 静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。


如果我所写内容存在问题,欢迎讨论,如果有所帮助,希望点赞,收藏加关注,我们一起努力!!

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

C++类与对象之静态成员和静态成员函数 的相关文章

随机推荐

  • 四旋翼飞行器Quadrotor飞控之 PID调节(参考APM程序)

    做四轴也有一段时间了 xff0c 最近一直在做PID 方面的工作 现在四轴基本可以 实现室内比较稳定的飞行 xff0c 操控手感也可以接受 稍后上试飞视频 在此把一些PID 方面的经验 总结总结和大家分享一下 首先介绍一下大概的硬件组成 x
  • Mavlink协议理解Pixhawk APM(一)

    有问题请回复评论 xff0c 然后邮箱提醒我回复 xff0c 550746284 64 qq com 私信不回 本系列博客共三篇 xff0c 这是第一篇 之前看了mavlink协议 xff0c 网上关于mavlink的资料不多 本文大概总结
  • Mavlink协议理解Pixhawk APM(二)

    本文是第二篇博客 xff0c 本系列博客共三篇 本文介绍mavlink里消息的种类和如何看懂开始时提到的那个官方的mavlink消息介绍https pixhawk ethz ch mavlink 有问题请回复评论 xff0c 然后邮箱提醒我
  • SqlServer数据库导入Excel数据:openrowset

    导入代码 xff1a declare 64 sql nvarchar 2000 declare 64 f excel varchar 100 set 64 f excel 61 39 导入文件名称 xlsx 39 IF EXISTS SEL
  • 安装ROS, 初始化时rosdep update出错解决办法

    背景 xff1a ubuntu上安装ROS xff0c 不管是在ubuntu16 04上装kinetic xff0c 还是在18 04上装melodic xff0c 安装完毕后 xff0c 进行初始化时 xff0c 反复失败 xff0c 试
  • Intel RealSense D435介绍、安装和使用

    实验室采购的三个Intel RealSense相机到了 xff0c 分别是D435 R200和blasterx senz3d xff0c 都试了一下 xff0c 除了适用的最佳距离范围不同 xff0c 其它功能大致相同 xff0c 用SDK
  • 配置适用于HoloLens开发的unity工程

  • HoloLens世界锚资料

    1 Unity 中的本地定位点传输 xff1a Unity 中的本地定位点传输 Mixed Reality Microsoft Docs https docs microsoft com zh cn windows mixed realit
  • HoloLens 2 之 Unity 开发基础入门指南

    研发实战 xff1a HoloLens 2 之 Unity 开发基础入门指南 知乎 查看 引用 信息源请点击 xff1a 映维网关于混合现实基础入门的指南 xff08 中文版 xff09 xff08 映维网 2021年03月15日 xff0
  • PCL学习资料

    01 代码学习博主 xff1a PCL读取PCD文件的数据 慕尘 博客园 1 pcd文件 rabbit pcd 链接 xff1a https pan baidu com s 1v6mjPjwd7fIqUSjlIGTIGQ 提取码 xff1a
  • obj文件格式与.mtl文件格式

    1 OBJ 是一种 3D模型文件 xff0c 因此不包含动画 材质特性 贴图路径 动力学 粒子等信息 但是可以读取 mtl 文件来获得材质信息 2 OBJ 文件使用 关键字根据数据类型排列 xff0c 每个关键字有一段简短描述 顶点数据 V
  • opencv_aruco

    文章参考 xff1a ArUco 木筏筏筏的博客 CSDN博客 aruco 1 01 显示识别mark cpp include lt opencv2 highgui hpp gt include lt opencv2 aruco hpp g
  • 详细图解,卷帘快门(Rolling Shutter)与全局快门(Global Shutter)的区别

    博客园 xff1a https www cnblogs com baiduboy p 14234884 html
  • ORB角点检测--快速近似最近邻(FLANN)匹配--c++

    描述子匹配 图像特征检测首先会获取关键点 xff0c 然后根据关键点周围像素ROI区域的大小 xff0c 生成描述子 xff0c 完整的描述子向量就表示了一张图像的特征 xff0c 是图像特征数据 xff0c 这种方式也被称为图像特征工程
  • 二进制信号量,互斥信号和计数信号量的区别

    VxWorks的信号量机制分析 VxWorks信号量是提供任务间通信 同步和互斥的最优选择 xff0c 提供任务间最快速的通信 也是提供任务间同步和互斥的主要手段 VxWorks提供3种信号量来解决不同的问题 二进制信号量 xff1a 最快
  • WiFi智能开关方案

    伴随着物联网的蓬勃发展 xff0c 智能家居成为备受瞩目的新兴领域 xff0c 越来越多的智能产品进入消费市场并受到了广大用户的青睐 xff0c 用于控制设备状态的传统机械开关也面临智能化升级 市面上出现了各种各样的智能开关 xff0c 以
  • VNect: Real-time 3D Human Pose Estimation with a Single RGB Camera

    采用了两个CNN 第一个是卷积神经网络 CNN xff0c 在残缺的单目捕捉条件下返回二维和三维关节位置 xff1b 这是基于标记的3D人体数据集以及补充的2D人体姿态数据集训练的 xff0c 提升了捕捉性能 xff1b 第二部分结合回归的
  • 系统异常SVC与PendSV指令及CM3 处理器内部寄存器分析

    参考文献 1 野火 uCOS III 内核实现与应用开发实战指南 基于STM32 xff1b 2 CM3 权威指南CnR2 xff08 电子版 xff09 Cortex M3 权威指南 Joseph Yiu 著 宋岩 译 xff1b 两个指
  • RTOS任务调度思想汇总_2(任务时间管理)

    1 任务是独立的 xff0c 并且初始化后进入死循环 格式像主函数 xff1b 2 任务的任务控制块 xff1a 首先要定义每个任务的任务控制块变量 xff0c 任务控制块只是一个数据类型 数据结构 xff0c 其数据结构定义的元素有任务堆
  • C++类与对象之静态成员和静态成员函数

    C 43 43 面向对象编程中 xff0c 静态成员也是较为重要的 C 43 43 的变量存储区除了堆区和栈区之外 xff0c 还存在静态存储区 xff0c 用于存放static静态变量 xff0c 全局变量以及常量 xff0c 生命周期是