【C++】---static成员(附OJ题)

在这里插入图片描述

一、静态成员变量

1.概念:
声明为static类成员称为类的静态成员静态成员分为两种:

(1)static修饰的成员变量:静态成员变量

(2)static修饰的成员函数:静态成员函数


注意:静态成员变量一定要在:类外进行初始化

2.如何计算一个类里面定义了多少个对象?

#include<iostream>
using namespace std;
class A
{
public:A(){++countA;}A(const A& n){++countA;}~A(){--countA;}// 静态成员函数 专门访问 静态成员变量static int GetCountA(){return countA;}
private:static int countA;// 静态成员变量在类内 只是 声明! //这里的countA存在于静态区(全局域),它属于整个类的所有对象
};int A::countA = 0; // (1)定义初始化:静态成员变量必须在类外,而且必须在 类 的后面!!!// (2)定义的时候,不加static!
int main()
{cout << A::GetCountA() << endl;A a1, a2;A a3(a1);cout << A::GetCountA() << endl;return 0;
}

注意:类中的所有对象要么是构造出来的,要么是拷贝构造出来的!
因此我们需要定义一个全局的变量(生命周期也是全局的)才能满足我们的计算需求。
即:静态成员变量(出了作用域不销毁)

1.静态成员变量 必须在类外定义和初始化的原因

那么如何对它countA进行定义初始化呢?如果在类内初始化的话,那么会导致每个对象都包含该静态成员

静态成员变量 必须在类外定义和初始化的原因:

(1)声明不分配内存,只有定义才会分配内存,如果在类内定义静态成员变量的话,那么每个对象进行初始化时都要为静态变量分配一块空间,这样会导致重复定义。

(2)静态成员和类处于同一级别普通成员和对象处于同一级别。 类级别的成员,应先于类对象的存在而存在,且静态成员变量应被所有类对象共享,所以静态成员变量不能放在类内当对象初始化时才初始化。

2.如何在类外访问 静态成员变量

(1)突破类域:(去掉private,私有)让静态成员变量变为公有(很少用!)

#include<iostream>
using namespace std;class A
{
public:A()//构造函数{++_n;}A(const A& a)//拷贝构造函数{++_n;}//private:static int _n;//n存在于静态区,属于整个类,不属于某个对象
};int A::_n = 0;int main()
{A a1;A a2;A();//这三行访问的都是全局的_n,因此打印结果都一样cout << A::_n << endl;//类名::静态成员变量cout << a1._n << endl;//对象.静态成员变量cout << a2._n << endl;//对象.静态成员变量
}

(2)在类内专门写一个公有的函数来访问静态成员变量

#include<iostream>
using namespace std;class A
{
public:A()//构造函数{++_n;}A(const A& a)//拷贝构造函数{++_n;}//获取静态成员变量的值int getN(){return _n;}private:static int _n;//n存在于静态区,属于整个类,不属于某个对象
};int A::_n = 0;int main()
{A a1;A a2;//这两行访问的都是全局的_n,因此打印结果都一样cout << A().getN() << endl;cout << a1.getN() << endl;cout << a2.getN() << endl;
}

二、静态成员函数

静态成员函数跟普通的函数一模一样,静态成员函数没有this指针。静态成员函数只能访问静态成员变量,不能访问非静态成员!

因此一般定义一个静态成员函数来访问静态成员变量:

#include<iostream>
using namespace std;
class A
{
public:A(){++countA;}A(const A& n){++countA;}~A(){--countA;}// 静态成员函数 专门访问 静态成员变量static int GetCountA(){return countA;}
private:static int countA;// 静态成员变量在类内 只是 声明! //这里的countA存在于静态区(全局域),它属于整个类的所有对象
};int A::countA = 0; // (1)定义初始化:静态成员变量必须在类外,而且必须在 类 的后面!!!// (2)定义的时候,不加static!
int main()
{cout << A::GetCountA() << endl;A a1, a2;A a3(a1);cout << A::GetCountA() << endl;return 0;
}

三、static成员的特性

这些应该在理解的基础上 ,记忆背诵!

  1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
  2. 静态成员变量必须在类外定义定义时不加static在类中只是声明
  3. 静态成员函数没有隐藏的this指针不能访问任何非静态成员
  4. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
  5. 静态成员也是类的成员受public、protected、private 访问限定符的限制

四、与static成员有关的OJ题

1.求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)OJ链接

解题思路:

(1)为了让函数执行n次,可以定义n个类对象,自动调用n次构造函数,在构造函数里面实现i自增和连续求和。

(2)为了使变量自增到n,使用i++,i不能作为成员变量,否则每个对象都有一个i,应该让所有对象都共享这个i,i应被定义成static。

class Sum
{
private:static int _i;static int _ret;
public:Sum()// 用构造函数实现_i的自增和_ret的连续求和!{_ret+=_i;++_i;}static int Get_ret() // 静态成员函数 专门获取 静态成员变量_ret{return _ret;}
};int Sum::_i=1;
int Sum::_ret=0;
class Solution 
{
public:int Sum_Solution(int n) {Sum arr[n]; // 调用了n次构造函数return Sum::Get_ret();}
};

方法二:
内部类的应用:

class Solution 
{// class不写private 默认就是 私有// Sum是Solution的内部类,可以访问Solution的私有class Sum{public:Sum(){_ret+=_i;_i++;}// 因为Sum是Solution的友元,调用上面的默认构造函数时,我需要访问_ret和_i时,我可以直接访问solution的私有,// 所里这也不用,再定义一个静态函数。//static int GetN()//{   //    return _ret;//}};
private:static int _i;static int _ret;
public:int Sum_Solution(int n) {Sum arr[n];// 数组arr调用n次Sum类的构造函数!return _ret;}
};
int Solution::_i=1;
int Solution::_ret=0;

2.计算日期到天数转换 :
oj链接

分析:
(1)数组不存放每月天数,而是存放1月1日到该月月底的天数;

(2)闰年要特殊处理

#include<iostream>
using namespace std;int main()
{int year, month, day;int GetMonDay[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };while (cin >> year >> month >> day){int sum = 0;// 这里的循环 只加了当前的 整月份!(对day还没加上)for (int i = 0; i < month; i++){sum = sum + GetMonDay[i];}if ((month > 2) && ((year % 4 == 0) && (year % 100 != 0))){sum = sum + day + 1;}else{sum = sum + day;}cout << sum << endl;}return 0;
}

好了,今天的分享就到这里了
如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!
在这里插入图片描述

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

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

相关文章

【云原生系列之kubernetes】--Ingress使用

service的缺点&#xff1a; 不支持基于URL等机制对HTTP/HTTPS协议进行高级路由、超时、重试、基于流量的灰度等高级流量治理机制难以将多个service流量统一管理 1.1ingress的概念 ingress是k8s中的一个对象&#xff0c;作用是如何将请求转发到service的规则ingress controlle…

Code Composer Studio (CCS) - 文件比较

Code Composer Studio [CCS] - 文件比较 References 鼠标单击选中一个文件&#xff0c;再同时按住 Ctrl 鼠标左键来选中第二个文件&#xff0c;在其中一个文件上鼠标右击选择 Compare With -> Each Other. References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.n…

UE5 C++ 静态加载资源和类

一.上篇文章创建组件并绑定之后 在Actor中加载初始化了组件&#xff0c;现在在组件中赋值。使用static ConstructorHelpers::FObjectFinder<T>TempName(TEXT("Copy Reference"))&#xff1b;再用TempName.Object //静态加载资源static ConstructorHelpers::FOb…

戴尔Dell R740服务器开机冒烟亮黄灯故障维修

今天分享的是一台过保修期的DELL PowerEdge R740服务器开机冒烟的维修案例。先上图&#xff1a; 接到用户报修后工程师立即响应&#xff0c;由于用户也是刚开工第一天服务器开机就出现了这种祥龙吐雾的祥兆&#xff0c;导致工厂业务流程无法正常使用&#xff0c;这台机器在东莞…

【plt.hist绘制直方图】:从入门到精通,只需一篇文章!【Matplotlib可视化】

【&#x1f4ca;plt.pie绘制直方图】&#xff1a;从入门到精通&#xff0c;只需一篇文章&#xff01;【Matplotlib可视化】&#xff01; 利用Matplotlib进行数据可视化示例 &#x1f335;文章目录&#x1f335; &#x1f4c8; 一、引言&#x1f50d; 二、plt.hist()函数基础&am…

flink state原理,TTL,状态后端,数据倾斜一文全

flink state原理 1. 状态、状态后端、Checkpoint 三者之间的区别及关系&#xff1f;2 算子状态与键控状态的区别2.1 算子状态2.2 键控状态2.3 算子状态api2.4 键控状态api 3 HashMapStateBackend 状态后端4 EmBeddedRocksDbStateBackend 状态后端5 状态数据结构介绍5.1 算子状态…

辽宁博学优晨教育科技有限公司视频剪辑培训专业之选

随着数字时代的到来&#xff0c;视频剪辑技术已成为各行各业不可或缺的一项技能。为了满足市场需求&#xff0c;辽宁博学优晨教育科技有限公司&#xff08;以下简称“博学优晨”&#xff09;推出了专业的视频剪辑培训课程&#xff0c;旨在为广大学员提供系统、高效的学习机会。…

Docker vs VM

关于应用程序的托管和开发&#xff0c;市场中的技术和产品琳琅满目。对比 Docker 和 VM&#xff0c;如何取舍&#xff1f;这主要由自身团队的因素决定&#xff0c;在选择 Docker 的情况下&#xff0c;你需要保证程序可在容器和虚拟机中运行。另外&#xff0c;成本和易用性也是重…

【视频编解码】M-JPEG压缩、H.264压缩 对比

简介 参考这篇文章&#xff1a;https://blog.csdn.net/qq_41248872/article/details/83590337 写的比较好&#xff0c;这里就不赘述了。 我们在视频传输的时候&#xff0c;需要压缩&#xff0c;常见的压缩包括: jpeg 压缩h264 压缩 当然使用最多的还是 264, 毕竟他的压缩比…

第二件事 在Java 虚拟机 (JVM)跑一个程序

上篇文章写了 在 WINDOWS上 创建了一个 JVM&#xff0c; 好&#xff01; 现在在这个 Java 虚拟计算机系统上跑一个Java语言编写的小程序&#xff1b; 题目&#xff1a; 用Java语言 编写一个小程序 在Console界面 打印 整数 1-10 (回头了一下源程序&#xff0c;靠&#xff0c;应…

【力扣每日一题】力扣105从前序与中序遍历序列构造二叉树

题目来源 力扣105从前序与中序遍历序列构造二叉树 题目概述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 思路分析 前序遍历的顺序是&#x…

用windbg调试uefi在hyper-v

添加环境变量 CLANG_BINC:\Program Files\NASM\ NASM_PREFIXC:\Program Files\NASM\ 添加path C:\Program Files (x86)\Windows Kits\10\Tools\x64\ACPIVerify 修改edk2-master\Conf\target.txt TARGET_ARCH X64 编译这两个包 #ACTIVE_PLATFORM EmulatorPkg/…

算法沉淀——BFS 解决拓扑排序(leetcode真题剖析)

算法沉淀——BFS 解决拓扑排序 01.课程表02.课程表 II03.火星词典 Breadth-First Search (BFS) 在拓扑排序中的应用主要是用来解决有向无环图&#xff08;DAG&#xff09;的拓扑排序问题。拓扑排序是对有向图中所有节点的一种线性排序&#xff0c;使得对于每一条有向边 (u, v)&…

Recorder 实现语音录制并上传到后端(兼容PC和移动端)

Recorder 首页&#xff1a;https://github.com/xiangyuecn/Recorder 一、安装 npm install recorder-core二、代码部分 1. HTML页面 <template><div><el-inputv-model"ttsText"type"textarea"placeholder"请输入内容"><…

外汇天眼:进Goccfx投资群前还好好的,踢出群后本金都没了

在外汇诈骗中&#xff0c;许多骗局都是以“拉群荐股”的方式&#xff0c;将一个个无辜的外汇投资者拽入虚假的外汇平台&#xff0c;投资者一旦进群&#xff0c;结果往往是被反向喊单而爆仓亏损。还有更过分的&#xff0c;就是诈骗分子利用投资者急于挽回损失的心理&#xff0c;…

YOLOv8-Openvino和ONNXRuntime推理【CPU】

1 环境&#xff1a; CPU&#xff1a;i5-12500 2 安装Openvino和ONNXRuntime 2.1 Openvino简介 Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包&#xff0c;主要用于对深度推理做优化。 Openvino内部集成了Opencv、TensorFlow模块&#xff0c;除此…

前端|Day3:CSS基础(黑马笔记)

Day3:CSS基础 目录 Day3:CSS基础一、CSS初体验二、CSS引入方式三、选择器1.标签选择器2.类选择器3.id选择器4.通配符选择器 四、盒子尺寸和背景色五、文字控制属性1.字体大小2.字体样式&#xff08;是否倾斜&#xff09;3.行高单行文字垂直居中 4.字体族5.font复合属性6.文本缩…

自适应网站建站源码系统 带完整的安装代码包以及搭建教程

在当今数字化时代&#xff0c;拥有一个功能全面且能够适应不同设备的网站对于企业和个人来说至关重要。罗峰给大家分享一款全新的自适应网站建站源码系统&#xff0c;它不仅提供了完整的安装代码包&#xff0c;还附带了详细的搭建教程&#xff0c;帮助用户轻松构建出具有响应式…

Atcoder ABC340 C - Divide and Divide

Divide and Divide&#xff08;分而治之&#xff09; 时间限制&#xff1a;2s 内存限制&#xff1a;1024MB 【原题地址】 所有图片源自Atcoder&#xff0c;题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 【输出格式】 【样例1】 【样例…

Windows制作Ubuntu的U盘启动盘

概要&#xff1a; 本篇演示在Windows10中制作Ubuntu22.04的U盘启动盘 一、下载Ubuntu22.04的iso文件 在浏览器中输入https://ubuntu.com去Ubuntu官网下载Ubuntu22.04的iso文件 二、下载Ultraiso 在浏览器中输入https://www.ultraiso.com进入ultraiso官网 点击FREE TRIAL&a…