6. C++类的静态成员
一、对象的生产期
- 生存期:对象从诞生到结束的这段时间
- 生存期分为静态生存期和动态生存期
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; }
};
上述代码是一个点类的模板,每新创建一个点类对象都会调用一次上述函数
每个类的实例都创建都创建一个独立的对象,每个对象都复制了类的数据或属性
每个对象管理各自得属性值
-
假设增加一个需求:统计点的总个数。考虑添加一个计数的数据成员
-
要求:
- 必须在任何时候都能在每个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;} };
上述代码存在的问题:
- 每次新定义一个点类,都要手动的修改count值,定义第1个则count改为1,定义第2个则count改为2,同时要将第1个对象的count值改为2,定义第3个则count改为3,同时要将第1个和第2个对象的count值改为3……
解决办法:指定count为一个静态数据成员
- 局部静态变量的生存期域程序的运行时间相同
- 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--; } // 每次撤销对象的时候自动调用,对象个数自动减1int 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加1cout << "Point A: " << a.getX() << ", " << a.getY();a.showCount(); // 输出对象个数Point b; // 定义对象b,其构造函数会使count加1cout << "Point B: " << b.getX() << ", " << b.getY();b.showCount(); // 输出对象个数return 0; }
三、静态成员函数
- 类外代码可以使用类名和作用域操作符来调用静态成员函数
- 静态成员函数只能引用属于该类的静态数据成员或静态成员函数
示例:
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--; } // 每次撤销对象的时候自动调用,对象个数自动减1int 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加1cout << "Point A: " << a.getX() << ", " << a.getY();Point::showCount(); // 输出对象个数Point b; // 定义对象b,其构造函数会使count加1cout << "Point B: " << b.getX() << ", " << b.getY();Point::showCount(); // 输出对象个数return 0;
}
相关文章:
6. C++类的静态成员
一、对象的生产期 生存期:对象从诞生到结束的这段时间生存期分为静态生存期和动态生存期 1.1 静态生存期 对象的生存期与程序的运行期相同,则称它具有静态生存期在文件作用域中声明的对象都是具有静态生存期的若在函数内部的局部作用域中声明具有静态…...
如何使Python Docker镜像安全、快速、小巧
一、说明 在微服务领域,拥有安全、高效和紧凑的 Docker 映像对于成功部署至关重要。本博客将探讨有助于构建此类映像的关键因素,包括不以 root 用户身份运行映像的重要性、在构建映像时更新和升级包、在编写 Dockerfile 指令时考虑 Docker 的层架构&…...
AWS——03篇(AWS之Amazon S3(云中可扩展存储)-01入门)
AWS——03篇(AWS之Amazon S3(云中可扩展存储)-01入门) 1. 前言2. 关于 Amazon S32.1 介绍2.1.1 简述2.1.2 详细介绍 2.2 Amazon S3 好处和功能2.3 3. 创建S3存储桶3.1 创建存储桶3.2 修改访问权限 4. 简单实用4.1 上传图片文件4.2…...
没有synchronized,rust怎么防并发?
学过Java的同学对synchronized肯定不陌生,那么rust里怎么办呢? 在Rust中,可以使用标准库提供的 std::sync::Mutex 来实现加锁功能。Mutex是互斥锁的一种实现,用于保护共享数据在并发访问时的安全性。 下面是一个简单的示例代码&a…...
1.Python简介及安装(3.11.4)
简介 Python 是一种解释型、面向对象、动态数据类型、高级、通用、解释型的高级程序设计语言。 Python 由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。 像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU General Public License) 协议。 官方宣布,…...
face_recognition人脸识别与人脸检测
1、安装face_recognition库 pip install face_recognition face_recognition库的人脸识别是基于业内领先的C开源库dlib中的深度学习模型,安装face_recognition库的同时会一并安装dlib深度学习框架。 2、face_recognition库的使用 1)load_image_file加…...
vue3获得url上的参数值
1、引入 import { useRoute } from vue-router2、获得const route useRoute() console.log(route.query.number)...
chapter15:springboot与监控管理
Spring Boot与监控管理视频 1. 简介 通过引入spring-boot-starter-actuator, 可以使用SpringBoot为我们提供的准生产环境下的应用监控和管理功能。我们可以通过http, jmx, ssh协议来进行操作,自动得到审计、健康及指标信息等。 步骤: 引入spring-boo…...
http历史版本
1,HTTP0.9 最早的http版本,后来才被定义为0.9版本。 这时候通信采用的是纯文本格式; 只支持get请求,且在服务器响应之后就关闭连接; 没有请求头的概念,功能比较简单。 2,HTTP1.0 这个版本增…...
【Go语言】Golang保姆级入门教程 Go初学者chapter2
【Go语言】变量 VSCode插件 setting的首选项 一个程序就是一个世界 变量是程序的基本组成单位 变量的使用步骤 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zuxG8imp-1691479164956)(https://cdn.staticaly.com/gh/hudiework/imgmain/image-20…...
关于ETL的两种架构(ETL架构和ELT架构) qt
ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库…...
【Linux】进程间通信——管道
目录 写在前面的话 什么是进程间通信 为什么要进行进程间通信 进程间通信的本质理解 进程间通信的方式 管道 System V IPC POSIX IPC 管道 什么是管道 匿名管道 什么是匿名管道 匿名管道通信的原理 pipe()的使用 匿名管道通信的特点 拓展代码 命名管道 什么是命…...
Element-plus中tooltip 提示框修改宽度——解决方案
tooltip 提示框修改宽度方法: 在element中,想要设置表格的内容,超出部分隐藏,鼠标悬浮提示 可以在el-table 上添加show-overflow-tooltip属性 同时可以通过tooltip-options配置提示信息 如下图代码 <el-tableshow-overflo…...
java实现当前系统时间格式化
import java.text.SimpleDateFormat; import java.util.Date;public class DateTest {public static void main(String[] args) {Date date new Date();System.out.println("当前系统时间:" date);SimpleDateFormat simpleDateFormat new SimpleDateFo…...
篇十一:享元模式:共享细粒度对象
篇十一:“享元模式:共享细粒度对象” 设计模式是软件开发中的重要工具,享元模式(Flyweight Pattern)是结构型设计模式的一种。享元模式旨在通过共享细粒度的对象,减少内存消耗和提高性能。在设计模式学习中…...
Dev控件 Gridcontrol,gridview 实现多选功能
在网上看了好多实现dev控件GridControl多选功能的方法,都很麻烦,其实GridControl有一个自带的实现多选功能的控件,很简单。 实现效果如下 无需代码代码,使用GridControl中自带的多选功能,在界面直接设置即可 1.找到要…...
内网穿透:如何通过公网访问本地Web服务器?
文章目录 前言1. 首先安装PHPStudy2.下载一个开源的网页文件3. 选择“创建网站”并将网页内容指向下载好的开源网页文件4. 打开本地网页5. 打开本地cpolar客户端6. 保存隧道设置 生成数据隧道 前言 随着科技进步和时代发展,计算机及互联网已经深深融入我们的生活和…...
在qemu中挂载镜像文件
将镜像文件作为交换分区 创建镜像文件: dd if/dev/zero ofswap.img bs512 count131072 qemu-system-arm -nographic -M vexpress-a9 -m 64M -kernel arch/arm/boot/zImage -append "rdinit/linuxrc consolettyAMA0 loglevel8" -dtb arch/arm/boot/dts/…...
报错注入(主键重复)攻击原理
基本原理 利用数据表中主键不能重复的特点,通过构造重复的主键,使得数据库报错,并将报错结果返回到前端。 SQL说明函数 以pet数据表为例进行说明 rond(): 返回[0,1)区间内的任意浮点数。 count(): 返回每个组的列行数。 如࿰…...
Golang基础教程
Golang基础教程 golang简介安装golanggolang开发工具go常用命令golang开发 vscode快捷键如何编写golang代码golang标识符、关键字、命名规则golang变量go语言常量go语言数据类型go语言布尔类型go语言数字类型golang字符串golang格式化输出golang运算符go语言中的流程控制golan…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
