8. 类的静态成员

news2024/11/17 3:48: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/509593.html

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

相关文章

配置Windows终端像Linux终端一样直接执行Python脚本

配置Windows终端像Linux终端一样直接执行Python脚本 1. 将Python加入环境变量2. 将Python后缀加入环境变量PATHEXT中3. 修改Python脚本的默认打开方式4. *将Python脚本命令加入环境变量*5. 测试 在Linux系统中&#xff0c;在Python脚本的开头指定Python解释器路径&#xff0c;即…

Terry部落简介

通过一个简单的服务&#xff0c;整理使用的技术 服务简介 Terry部落&#xff0c;基于目前主流 Java Web 技术栈&#xff08;SpringBoot MyBatis-plus MySQL Redis Kafka Elasticsearch shiro …&#xff09;实现的个人博客服务。包含登陆、注册、文章发布、资源发布、鉴…

ACM - 数学 - 提高(还没学多少)

ACM - 数学 练习题 一、数论1、分解质因数 &#xff1a;AcWing 197. 阶乘分解2、求约数个数&#xff08;1&#xff09;AcWing 1294. 樱花 &#xff08;求 n&#xff01;约数个数之和&#xff09;&#xff08;2&#xff09;AcWing 198. 反素数 &#xff08;求 1 ~ N 中约数最多的…

human-NeRF 代码运行环境完全打包(根据照片视频生成三维模型)

包含模型和可以直接运行的数据的代码环境&#xff08;window环境&#xff0c;linux应该也可以运行&#xff09;&#xff0c;下载链接放在文章最后&#xff0c;不需要你自己再去下载任何的代码和模型了。 下载后输入三行命令在命令行界面即可将代码跑起来&#xff1a; pip insta…

C++14:AVL树

由于二叉搜索树在某些特定的情况下会退化成单叉树,为了解决这个问题&#xff0c;保证二叉搜索树能在绝大多数情况下保持高速搜索&#xff0c;G.M. Adelson-Velsky和E.M. Landis这两位俄国数学家提出了AVL树的概念&#xff0c;也就是高度平衡的搜索二叉树。 AVL树平衡大体逻辑&…

ACM - 数据结构 - 基础(数组模拟链表 / 栈 / 队列 + 字典树 + 并查集 + 堆 + 哈希)

数据结构 一、线性表1、单链表模板题&#xff1a;AcWing 826. 单链表 2、双链表模板题 AcWing 827. 双链表 3、栈数组模拟栈模板 AcWing 828. 模拟栈逆波兰简版模板例题1、逆波兰表达式&#xff1a;HDU 1237 简单计算器&#xff08;写得有点复杂&#xff09; 4、队列数组模拟队…

接口自动化测试可以使用的几个常用的框架

接口自动化测试可以使用以下几个常用的框架&#xff1a; 1、pytest pytest是一个用于Python编写单元测试和功能测试的框架。它提供了简洁的语法、灵活的扩展性和丰富的插件&#xff0c;可以帮助开发人员高效地编写测试用例&#xff0c;并快速定位和解决问题。 以下是pytest的…

数据结构刷题(三十一):1049. 最后一块石头的重量 II、完全背包理论、518零钱兑换II

一、1049. 最后一块石头的重量 II 1.思路&#xff1a;01背包问题&#xff0c;其中dp[j]表示容量为j的背包&#xff0c;最多可以背最大重量为dp[j]。 2.注意&#xff1a;递推公式dp[j] max(dp[j], dp[j - stones[i]] stones[i]);本题中的重量就是价值&#xff0c;所以第二个…

边缘计算盒子适合用于哪些场景?

边缘计算盒子适用于在智慧工地、智慧工厂、智慧园区和智慧城管等场景中可以实现多种算法功能&#xff0c;以下是一些应用和实现算法功能&#xff1a; 智慧工地&#xff1a;实时视频监控与分析&#xff1a;边缘计算盒子可以处理实时监控视频流&#xff0c;进行人员和车辆识别、…

OpenPCDet系列 | 5.PointPillars模型前向传播完整流程

文章目录 前向传播流程1. 模型初始化2. 模型训练前向传播前向传播流程 这里以PointPillars模型为例,在PointPillars模型中主要划分了以下4个主要的模块,以下某块首先会在build_network中进行初始化,然后在具体前向传播时通过forward函数进行。下面进行区分。 PointPillars…

新颖拓扑指纹助力虚拟筛选:ToDD革新计算机辅助药物发现之路

编译 | 于洲 今天我们介绍由Novartis集团的Novartis与德克萨斯大学达拉斯分校的Baris Coskunuzer为第一作者发表在NeurIPS 2022会议上的工作&#xff0c;文章介绍了一种新的虚拟筛选方法——ToDD模型&#xff0c;该方法使用了多参数持久性同调&#xff08;MP&#xff09;来生成…

wx.request get请求重定向问题

微信小程序wx.request请求&#xff0c;重定向问题。 背景 在开发微信小程序项目的时候&#xff0c;使用wx.request请求一个公共接口&#xff0c;结果请求被重定向多次之后&#xff0c;返回失败&#xff0c;而且没有 code 码&#xff0c;只有一个 errMsg: request:fail。 Netw…

OpenShift - 使用 Ansible Automation Platform 纳管 OpenShift Virtualization 虚机

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在支持 OpenShift 4.12 的 OpenShift 环境中验证 本文所用到的运行环境和配置方法请先参照以下 blog 准备&#xff1a; 《OpenShift 4 - 安装部署 Ansible Automation Platform 4.x 控制台》《OpenShift …

React 组件

文章目录 React 组件复合组件 React 组件 本节将讨论如何使用组件使得我们的应用更容易来管理。 接下来我们封装一个输出 “Hello World&#xff01;” 的组件&#xff0c;组件名为 HelloMessage&#xff1a; React 实例 <!DOCTYPE html> <html> <head> &…

css中的grid高频布局

1.需求 1.一个父级容器内有n个子元素; 2.每个子元素最小宽度是100px&#xff1b; 3.每个子元素最大宽度根据屏幕宽度自适应&#xff1b; 4.每个子元素的宽度保持同宽&#xff1b; 5.每个元素之间有间隔&#xff0c;每一行的两边不留间隙&#xff0c;每一列的上下不留间隙&…

2.V853支持WIFI和有线网卡

100ASK-V853-PRO开发板支持WIFI和有线网卡 0.前言 ​ 通过上一章节&#xff0c;我们已经成功下载Tina SDK包&#xff0c;完成编译并烧写Tina Linux系统&#xff0c;接下来展示100ASK_V853-PRO开发部如何通过WIFI和有线网卡进行上网。 全志Linux Tina-SDK开发完全手册&#x…

02-mysql升级篇(rpm方式+压缩包升级)

文章目录 升级方式一、二进制方式安装1、下载mysql-5.7.42安装包&#xff08;mysql-5.7.37升级mysql-5.7.42&#xff09;2、备份数据库、my.cnf文件&#xff0c;停止mysql服务&#xff08;重要&#xff09;3、查看当前数据库版本3、上传 mysql-5.7.42-1.el7.x86_64.rpm-bundle.…

SpringMVC 详解

文章目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式&#xff1a;warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求控制器5、创建springMVC…

关于太阳黑子数的查询

太阳黑子数查询地址&#xff1a;点此跳转 浏览器中打开下图所示的网站。 根据自己的需求下载相应的文件查找太阳黑子数&#xff0c;下载时可以选择 TXT 文件格式&#xff0c;也可以选择 CSV 文件格式。 我下载了每日估计的太阳黑子数&#xff0c;TXT 格式文件打开如下图所示。…

免费下载的无水印人物素材网站!

在日常设计中&#xff0c;设计师常常需要使用人物素材来提升设计作品的吸引力。一个可爱的人物插画可以使网页界面更加生动&#xff0c;一个富有个性的人物素材可以让应用程序更具吸引力&#xff0c;引发用户的共鸣。但设计师有时会苦恼于找不到合适的人物素材网站&#xff0c;…