6. C++类的静态成员

news2024/11/19 11:25:22

一、对象的生产期

  • 生存期:对象从诞生到结束的这段时间
  • 生存期分为静态生存期和动态生存期

1.1 静态生存期

  • 对象的生存期与程序的运行期相同则称它具有静态生存期
  • 在文件作用域中声明的对象都是具有静态生存期的
  • 若在函数内部的局部作用域中声明具有静态生存期的对象,则要使用static关键字
    • 局部作用域中静态变量的特点
      • 不会随着每次函数调用而产生一个副本,也不会随着函数返回而失效,该变量会在各次调用间共享

1.2 动态生存期

  • 非静态变量的对象都具有动态生存期
  • 在局部作用域中声明的具有动态生存期的对象,也称为局部生存期对象,它诞生于声明点,结束于声明所在的块执行完毕之时

二、类的静态成员

2.1 类静态成员的特点

  • 用关键字static声明
  • 为该类的所有对象共享,静态数据成员具有静态生存周期
  • 必须在类外定义和初始化,用 “ :: ” 来指明所属的类
    • “ :: ” 是作用域操作符

2.2 为什么需要静态数据成员?

示例:

#include <iostream>
using namespace std;

// 一个点类,点的属性:坐标
class Point{
private:
    int x, y;
public:
    Point(int x = 0, int y = 0) : x(x), y(y){ } 
    ~Point() { }
    int getX() { return x; }
    int getY() { return y; }
};

上述代码是一个点类的模板,每新创建一个点类对象都会调用一次上述函数

image-20230510093819310

每个类的实例都创建都创建一个独立的对象,每个对象都复制了类的数据或属性

每个对象管理各自得属性值

  • 假设增加一个需求:统计点的总个数。考虑添加一个计数的数据成员

  • 要求:

    • 必须在任何时候都能在每个Student对象中使用加法函数
    • 当生成一个新的Student实例的时候,必须保证,所有Student对象都实现了总人数的计数
    class Point{
    private:
        int x, y;
        int count;	// 用于记录点的个数
    public:
        Point(int x = 0, int y = 0) : x(x), y(y){ } 
        ~Point() { }
        int getX() { return x; }
        int getY() { return y; }
        
        void addCount() { count++; }
        void showCount() {
            count << " Object count = " << count << endl;
        }
    };
    
    image-20220606213201865

    上述代码存在的问题:

    • 每次新定义一个点类,都要手动的修改count值,定义第1个则count改为1,定义第2个则count改为2,同时要将第1个对象的count值改为2,定义第3个则count改为3,同时要将第1个和第2个对象的count值改为3……

    解决办法:指定count为一个静态数据成员

    image-20220606214017145
    • 局部静态变量的生存期域程序的运行时间相同
    • count仍然是局部变量,可以看成是所有Point对象共享的一般变量
    class Point{
    private:
        int x, y;
        static int count;	// 静态数据成员声明,用于记录点的个数
    public:
        Point(int x = 0, int y = 0) : x(x), y(y){ count++; } // 每次创建对象时都会自动调用,自动将对象个数加1
        ~Point() { count--; }	// 每次撤销对象的时候自动调用,对象个数自动减1
        int getX() { return x; }
        int getY() { return y; }
        
        void showCount() {
            count << " Object count = " << count << endl;
        }
    };
    
    // 静态数据成员在类外定义和初始化,使用类名限定
    int Point::count = 0;
    
    int main() {
        Point a(4, 5);	// 定义对象a,其构造函数会使count加1
        cout << "Point A: " << a.getX() << ", " << a.getY();
        a.showCount();	// 输出对象个数
        
        Point b;	// 定义对象b,其构造函数会使count加1
        cout << "Point B: " << b.getX() << ", " << b.getY();
        b.showCount();	// 输出对象个数
        
        return 0;
    }
    
image-20230510101157944

三、静态成员函数

  • 类外代码可以使用类名和作用域操作符来调用静态成员函数
  • 静态成员函数只能引用属于该类的静态数据成员或静态成员函数

示例:

class Point{
private:
    int x, y;
    static int count;	// 静态数据成员声明,用于记录点的个数
public:
    Point(int x = 0, int y = 0) : x(x), y(y){ count++; }   // 每次创建对象时都会自动调用,自动将对象个数加1
    ~Point() { count--; }								// 每次撤销对象的时候自动调用,对象个数自动减1
    int getX() { return x; }
    int getY() { return y; }
    
    static void showCount() {
        count << " Object count = " << count << endl;
    }
};

// 静态数据成员在类外定义和初始化,使用类名限定
int Point::count = 0;

int main() {
    Point a(4, 5);	// 定义对象a,其构造函数会使count加1
    cout << "Point A: " << a.getX() << ", " << a.getY();
    Point::showCount();	// 输出对象个数
    
    Point b;	// 定义对象b,其构造函数会使count加1
    cout << "Point B: " << b.getX() << ", " << b.getY();
    Point::showCount();	// 输出对象个数
    
    return 0;
}

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

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

相关文章

红帽8.2版本CSA题库:第二题配置您的系统以使用默认存储库

vim /etc/yum.repos.d/BaseOS_AppStream.repo [BaseOS] nameBaseOS baseurlhttp://foundation0.ilt.example.com/dvd/BaseOS gpgcheck0 enabled1[AppStream] nameAppStream baseurlhttp://foundation0.ilt.example.com/dvd/AppStream gpgcheck0 enabled1:wq&#xff01; #保存…

Vulkan 绘制显示设计

背景 众所周知&#xff0c;Vulkan是个跨平台的图形渲染API&#xff0c;为了友好地支持跨平台&#xff0c;Vulkan自然也抽象出了很多接口层去对接各个操作系统&#xff0c;抹平系统间的差异&#xff0c;Swap Chains即为WSI。 其本质上是一种图像队列&#xff0c;此队列会按顺序…

k8s资源管理方法详解(陈述式、声明式)

目录 一&#xff1a;陈述式资源管理方法 二&#xff1a; 基本信息查看 1、查看信息 2、创建 3、删除 4、service 的 type 类型 三&#xff1a;项目实例 1、创建 kubectl create命令 2、发布 kubectl expose命令 3、在 node 节点上操作&#xff0c;查看负载均衡端…

cuda系列详细教程

随着人工智能的发展与人才的内卷&#xff0c;很多企业已将深度学习算法的C部署能力作为基本技能之一。面对诸多arm相关且资源有限的设备&#xff0c;往往想更好的提速&#xff0c;满足更高时效性&#xff0c;必将更多类似矩阵相关运算交给CUDA处理。同时&#xff0c;面对市场诸…

千帆大模型平台再升级:接入大模型最多、Prompt模板最全面

一、前言 近年来AI领域的发展取得了长足的进步&#xff0c;孵化出的相关产品可谓是如火如荼。尤其是最近爆火的ChatGPT&#xff0c;让非IT领域的其他领域的小伙伴也开始接触并使用它。其实它的爆火不是偶然&#xff0c;是因为ChatGPT实实在在的强大&#xff0c;真真切切的能解…

痞子衡嵌入式:借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家分享的是借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间。 最近痞子衡写了篇文章 《i.MXRT从Serial NAND启动时间测量》&#xff0c;这篇文章详细测试了不同长度的 Non-XIP 程序在不同 …

Angular安全专辑 —— CSP防止XSS攻击

什么是 CSP&#xff08;Content Security Policy&#xff09; CSP&#xff08;Content Security Policy&#xff09;是一种Web安全策略&#xff0c;用于减轻和防止跨站脚本攻击&#xff08;XSS&#xff09;等安全漏洞。它通过允许网站管理员定义哪些资源可以加载到网页中&#…

【动态规划】数字三角形

算法提高课课堂笔记。 文章目录 摘花生题意思路代码 最低通行费题意思路代码 方格取数题意思路代码 摘花生 题目链接 Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。 地里每个道…

解决GitHub超时上不去

Github对于开发者开发者开发者来说肯定不陌生&#xff0c;但是Github 经常连接不上显示超时&#xff0c;一般都是节点ip的问题。本文主要介绍一下如何通过修改 Hosts 提升 Github 访问速度。之前在 Hosts 文件有加入过节点&#xff0c;不过容易失效&#xff0c;所以自己得常更新…

A10VSO140EF7、A10VSO45ED71变量柱塞泵比例放大器

A10VSO18EF1、A10VSO28EF2、A10VSO45EF5、A10VSO71EF7、A10VSO100EF2、A10VSO140EF7、A10VSO45ED71、A10VSO71ER72、A10VSO100ED71、A10VSO140ER72、A10VSO180ER71比例变量柱塞泵电流信号实现电比例控制。 高精确度。 发生电源故障时的安全功能&#xff0c;例如制动和转向系统…

Python爬虫(八)_Requests的使用

Requests&#xff1a;让HTTP服务人类 虽然Python的标准库中urllib2模块中已经包含了平常我们使用的大多数功能&#xff0c;但是它的API使用起来让人感觉不太好&#xff0c;而Requests自称"HTTP for Humans"&#xff0c;说明使用更简单方便。 Requests唯一的一个非转…

LeetCode--HOT100题(24)

目录 题目描述&#xff1a;234. 回文链表&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;234. 回文链表&#xff08;简单&#xff09; 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &…

微信-jssdk使用

需求: h5中使用微信的jsSDK,后续实现微信定位以及多图上传 微信文档 申请测试公众号 1.测试公众号进行配置 其中的域名是本地的ip地址 config接口进行权限配置,动态获取JS-SDK权限验证的签名 获取公众号accessToken以及jsTicket public static String WeChatAppId="wx…

Redis数据库的下载和安装

目录 第一章、Redis数据库的下载和安装1.1&#xff09;nosql数据库和 Redis 介绍1.2&#xff09;Windows中下载安装Redis数据库1.3&#xff09;Linux中安装Redis数据库1.4&#xff09;Linux中启动redis1.5&#xff09;Linux中关闭redis 第二章、三种Redis客户端连接Redis数据库…

0804|IO进程线程day7 【重点】线程的同步互斥(互斥锁、信号量、条件变量的概念及基本操作)

线程的同步互斥中的两个概念&#xff1a;临界资源、临界区&#xff1a; 临界资源&#xff1a;当多个任务同时访问一个资源的时候&#xff0c;我们将该资源称之为临界资源。临界区&#xff1a;访问临界资源的代码&#xff0c;称之为临界区线程之间&#xff0c;如果要进行通信&am…

从少年变成恶龙的平台经济

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦midjourney 产品统筹 / bobo 录音间 / 声湃轩北京站 东方甄选和抖音的“矛盾”再一次暴露出平台经济与入驻者之间微妙的关系。 平台经济&#xff0c;从一个引领时代…

人工智能有可能使下一代智力贫乏?

在ChatGPT推出之前&#xff0c;Maya认识的绝大多数大学生都会通过Google去完善自己的论文帮助。但人工智能之前的互联网其实是做不到真正的“高水平抄袭”&#xff0c;因为你根本无法找到复杂、具体、有创意或个性化的答案。 以上面提到的冲突解决课论文为例&#xff0c;写作要…

Effective Java笔记(30)优先考虑泛型方法

正如类可以从泛型中受益一般 &#xff0c;方法也一样。静态工具方法尤其适合于泛型化 。 Collections 中的所有“算法”方法&#xff08;例如 binarySearch 和 sort &#xff09;都泛型化了 。 编写泛型方法与编写泛型类型相类似 。 例如下面这个方法&#xff0c;它返回两个集合…

实战项目ssm权限系统 3-自定义注解+AOP拦截器记录登录日志

一 登录日志以及操作操作日志的操作 1.1 登录日志配置收集 1.1.1 编写log入库的service层接口 1.接口&#xff1a;在spring-security模块中 2.实现类&#xff1a;在service-system模块中 3.dao层&#xff1a;在service-system模块中 1.1.2 过滤器添加log记录 在过滤器中&…

ArcGISPro中如何使用机器学习脚本

点击工程 打开包管理器&#xff0c;我们可以发现&#xff0c;无法修改ArcGIS自带的默认python环境&#xff0c;所以我们需将默认环境进行克隆 点击设置 设置要克隆的地方&#xff0c;点击确定 激活克隆的环境&#xff0c;然后重写启动ArcGISPro 搜索并点击需要安装的库&#xf…