【C++】-static在类和对象中的作用和细节(下)

💖作者:小树苗渴望变成参天大树
❤️‍🩹作者宣言:认真写好每一篇博客
💨作者gitee:gitee
💞作者专栏:C语言,数据结构初阶,Linux,C++

在这里插入图片描述

文章目录

  • 前言


前言

今天我们来讲一个static对类的对象的作用和用法,这个关键字在类和对象中有很大的作用,话不多说,我们开始进入正文。


创建一个类,计算在一个程序中创建了多少个类对象:

int _scount = 0;//通过全局变量来计算对象的个数
class A
{
public:
  A() { ++_scount; }//默认构造函数
  A(const A & t) { ++_scount; }//拷贝构造
  ~A() { --_scount; }//析构函数
private:

};

A a1;

void fun()
{
	A a;
	cout <<__LINE__ << ":" << _scount << endl;
}
int main()
{
	A a2;
	cout << __LINE__ <<":" << _scount << endl;
	fun();
	cout << __LINE__ << ":" << _scount << endl;
	return 0;
}

在这里插入图片描述
但是对于全局变量很危险,都可以访问或者修改它,我们使用全局变量的特点是它的生命周期长,是整个程序,所以使用它,我们也想要这种效果,又安全,只能在类中设置私有的静态的成员变量

class A
{
public:
  A() { ++_scount; }//默认构造函数
  A(const A & t) { ++_scount; }//拷贝构造
  ~A() { --_scount; }//析构函数
private:
	static int _scount;//通过静态变量来计算对象的个数
};

静态变量是存放在静态区的,生命周期是整个程序。因为初始化列表是给对象中成员变量定义的地方,对象定义在栈区,所以没有办法使用初始化列表,也不能给缺省值,因为缺省值就是给初始化列表使用的,所以我们只能使用全局的来初始化静态的私有的成员变量,这时候理解为规定可以突破类域的限定在类外初始化(静态成员变量,类里面生明,类外面定义)

成员变量:属于每个类对象的,存储在对象里面
静态成员变量:属于类,是每个类对象共享的,存储在静态区里面的

int A::_scount = 0;//这是规定的格式

但是我们要怎么访问到私有的静态的成员变量呢??肯定不能直接访问,又两种解决办法
1.使用共有成员函数

class A
{
public:
  A() { ++_scount; }//默认构造函数
  A(const A & t) { ++_scount; }//拷贝构造
  ~A() { --_scount; }//析构函数
  int GetACount() { return _scount; }
private:
	static int _scount;//通过静态变量来计算对象的个数
};
int A::_scount = 0;

在这里插入图片描述
我们需要通过对象去调用,大家看看这么写是不是不太舒服,而且有点乱,什么对象都可以调用,理解性不高,这是我们使用static的成员函数,直接使用类名去调用,因为使用静态的,成员函数就没有this指针了,所以可以使用类名去调用
在这里插入图片描述

2.使用友元函数
在这里插入图片描述

我们来看看下面几个问题:

  1. 静态成员函数可以调用非静态成员函数吗?
  2. 非静态成员函数可以调用类的静态成员函数吗?

在这里插入图片描述
大家应该可以很清楚的看到结果了吧,因为静态的是没有this指针,调用非静态就没有东西传给this指针了

  1. 静态成员函数不可以调用非静态成员函数
  2. 非静态成员函数可以调用类的静态成员函数
    大家也可以借此机会回顾一下const修饰的对象,能不能调用其他普通函数,普通函数能不能调用const对象。多是一个道理,理解就好了

总结特性:

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

我们来做一题来看看这个static的作用,在做这个体之前,我要铺垫一个知识:
我们在在定义一个自定义类型的数组,数组有多大,就创建了几次对象赋给数组里面,我们来看效果:
在这里插入图片描述

在这里插入图片描述
大家来看一下这个题,我们刚好利用了静态的特性,和自定义数组

class Sum
{
public:
    Sum()
    {
        _ret+=_i;
        _i++;
    }
    static int sum()
    {
        return _ret;
    }
private:
    static int _i;
    static int _ret;
};
int Sum::_i=1;
int Sum::_ret=0;

class Solution {
public:
    int Sum_Solution(int n) {
        Sum a[n];
        return Sum::sum();
    }
};

这个题目还有一种解法,等我讲到内部类的时候在详细介绍对于静态在类中的作用和使用大家应该知道了吧, 我们下篇在见

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++模板template

我们现在有几个变量&#xff0c;我们向要实现他们的交换&#xff0c;所以我们现在写了一个swap函数 我们现在可以实现对这两个变量之间的交换&#xff0c; 那么我们有有两个变量需要交换呢&#xff1f;&#xff1f; 我们刚才的Swap函数的参数是int类型的&#xff0c;我们现在的…

SOME/IP 草稿

SOME/IP 名词解释 SOME/IP 全称是 Scalable service-Oriented MiddlewarE over IP。也就是基于 IP 协议的面向服务的可扩展性通信中间件协议。 面向服务 SOA基于 IP 协议之上的通信协议中间件 SOME/IP 功能 服务发现 (Service Discovery)远程服务调用 &#xff08;RPC,rem…

ConvTranspose2d 的简单例子理解

文章目录 参考基础概念output_padding 简单例子&#xff1a; stride2step1step2step3 参考 逆卷积的详细解释ConvTranspose2d&#xff08;fractionally-strided convolutions)nn.ConvTranspose2d的参数output_padding的作用torch.nn.ConvTranspose2d Explained 基础概念 逆卷…

VMware、CentOS、XShell、Xftp的安装

第 1 章 VMware 1.1 VMware 安装 一台电脑本身是可以装多个操作系统的&#xff0c;但是做不到多个操作系统切换自如&#xff0c;所以我们 需要一款软件帮助我们达到这个目的&#xff0c;不然数仓项目搭建不起来。 推荐的软件为 VMware&#xff0c;VMware 可以使用户在一台计…

一篇文章搞定《Android中的ANR》

------《ANR》 什么是ANR举个例子帮你认识ANRANR的产生原因ANR的监控手段方法一: 监控trace文件夹方法二&#xff1a;利用我们主线程的Looper方法三&#xff1a;监控SIGQUIT信号 ANR日志Traces.txtTraces文件分析几个分析案例&#xff1a;一、好定位的问题&#xff08;简单案例…

【C++】设计模式

目录 设计模式概述 单例模式 饿汉模式 懒汉模式 工厂模式 简单工厂模式 工厂方法模式 抽象工厂模式 观察者模式 设计模式概述 设计模式&#xff1a;一套反复被人使用、多数人知晓的、经过分类编目的代码设计经验的总结。一种固定的写代码的思维逻辑方式&#xff0c;一…

小学妹刚毕业没地方住想来借宿,于是我连夜用Python给她找了个好房子,我真是太机智了

事情是这样的&#xff0c;小学妹刚毕业参加工作&#xff0c;人生地不熟的&#xff0c;因为就在我附近上班&#xff0c;所以想找我借宿。。。 想什么呢&#xff0c;都不给住宿费&#xff0c;想免费住&#xff1f;于是我用Python连夜给她找了个单间&#xff0c;自己去住吧&#…

ChatGPT api 接口调用测试

参考文档&#xff1a; https://platform.openai.com/docs/quickstart/build-your-application示例说明&#xff1a; 本示例会生成一个简单的ChatGPT api接口调用server程序&#xff0c;该程序可以给用户输入的宠物类别为宠物取三个名字。打开网页后&#xff0c;会看到用户输入…

机器学习在生态、环境经济学中的应用及论文写作

近年来&#xff0c;人工智能领域已经取得突破性进展&#xff0c;对经济社会各个领域都产生了重大影响&#xff0c;结合了统计学、数据科学和计算机科学的机器学习是人工智能的主流方向之一&#xff0c;目前也在飞快的融入计量经济学研究。表面上机器学习通常使用大数据&#xf…

【一起撸个深度学习框架】6 折与曲的相会——激活函数

CSDN个人主页&#xff1a;清风莫追欢迎关注本专栏&#xff1a;《一起撸个DL框架》GitHub获取源码&#xff1a;https://github.com/flying-forever/OurDLblibli视频合集&#xff1a;https://space.bilibili.com/3493285974772098/channel/series 文章目录 6 折与曲的相会——激活…

使用Visual Studio进行cuda编程配置环境四大坑(附解决方案)

写在前面&#xff0c;用于没有使用过Visual Studio进行cuda编程的同学看&#xff0c;以免在安装环境的时候踩到坑 第一坑&#xff1a;CUDA版本与NVIDIA显卡版本不匹配问题: 安装cuda版本坑&#xff0c;强烈建议看下自己的显卡支持什么版本的cuda&#xff0c;切记不要用最新版…

IP 子网划分详解

文章目录 1 概述1.1 划分目的1.2 划分原则1.3 子网掩码 2 IP 子网划分示例3 网工软考真题3.1 判断网络号和主机号3.2 计算可容纳的主机数 1 概述 IP 子网划分&#xff1a;实际上就是设计 子网掩码 的过程。原因&#xff1a;由于在五类的IP地址中&#xff0c;网络号与主机号的的…

Class 02 - R语言Rstudio的安装

Class 02 - R语言&Rstudio的安装 下载和安装R安装前准备下载R语言安装R语言开始使用R语言 下载和安装RStudio安装前准备下载RStudio安装RStudio开始使用RStudio如何编写代码 下载和安装R 在这个部分中&#xff0c;你将完成在计算机上下载和安装R语言程序。当安装完成后&am…

ThingsBoard部署tb-gateway并配置OPCUA

1、安装 我实在自己的虚拟机上安装,使用官方Docker的安装方式 docker run -it -v ~/.tb-gateway/logs:/thingsboard_gateway/logs -v ~/.tb-gateway/extensions:/thingsboard_gateway/extensions -v ~/.tb-gateway/config:/thingsboard_gateway/config --name tb-gateway --…

JavaScript的三座大山

前言&#xff1a;这个题目是抄的&#xff0c;看着很有意思&#xff0c;就拿过用了&#xff0c;毕竟CV是程序员的基本功底嘛&#xff0c;顺带把图也拿过来了 作用域和闭包 这个几乎是天天在用的东西&#xff0c;可能有些人甚至不知道这个概念&#xff0c;但是用到过这种方法去解…

Html中使用jquery通过Ajax请求WebService接口以及跨域问题解决

场景 VS2019新建WebService/Web服务/asmx并通过IIS实现发布和调用&#xff1a; VS2019新建WebService/Web服务/asmx并通过IIS实现发布和调用_霸道流氓气质的博客-CSDN博客 在上面实现发布WebService的基础上&#xff0c;怎样在html中通过jquery对接口发起 请求和解析数据。…

测试4年,跳槽一次涨8k,我跳了3次···

最近有人说&#xff0c;现在测试岗位初始工资太低了&#xff0c;有些刚刚入行的程序员朋友说自己工资连5位数都没有.....干了好几年也没怎么涨。看看别人动辄月薪2-3万&#xff0c;其实我想说也没那么难。说下如何高效地拿到3w。 1.暂且把刚入行的条件设低些吧&#xff0c;大专…

【野火启明_瑞萨RA6M5】梦的开始 ---- 点灯(FSP库)

文章目录 一、FSP配置二、hal_entry入口函数三、封装 LED 设备驱动程序下载验证 一、FSP配置 对于 Keil 开发环境&#xff1a; 拷贝一份之前的 Keil 工程模板 “06_Template”&#xff0c; 然后将工程文件夹重命名为 “11_GPIO_LED”&#xff0c;并进入该文件夹里面双击 Keil …

EW代理工具的使用说明

一、EW介绍 Earthworm&#xff08;EW&#xff09; 是一套便携式的网络穿透工具&#xff0c;具有 SOCKS v5服务架设和端口转发两大核心功能&#xff0c;可在复杂网络环境下完成网络穿透。 该工具能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道&#xff0c;直达…

5年自动化测试,终于进字节跳动了,年薪30w其实也并非触不可及

一些碎碎念 什么都做了&#xff0c;和什么都没做其实是一样的&#xff0c;走出“瞎忙活”的安乐窝&#xff0c;才是避开弯路的最佳路径。希望我的经历能帮助到有需要的朋友。 在测试行业已经混了5个年头了&#xff0c;以前经常听到开发对我说&#xff0c;天天的点点点有意思没…
最新文章