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

news2024/10/6 18:32:07

💖作者:小树苗渴望变成参天大树
❤️‍🩹作者宣言:认真写好每一篇博客
💨作者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.coloradmin.cn/o/529874.html

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

相关文章

安全基础第十二天:nginx相关配置和nginx-host绕过

目录 一、nginx的动静分离 1.动静分离的原理 2.动静分离实验&#xff08;centos做为放置静态资源的服务器&#xff0c;ubuntu做为请求的web服务器&#xff09; &#xff08;1&#xff09;在centos的/usr/local/nginx/html下创建一个静态文件static &#xff08;2&#xff09…

目标检测概述

传统目标检测 任务目标 从图像中找出相应的物体位置 目标检测的核心目的在于&#xff0c;估计出目标在图像中的坐标。 问题定义 目标检测的结果是什么&#xff1f; 预测出目标在图像中的位置。 位置如何表示&#xff1f; 通常采用水平矩形框的形式估计目标。 在opencv中…

为什么Java要求多用组合,少用继承?

前言&#xff1a; 最近有一个要好的朋友去阿里大厂面试Java高级工程师&#xff0c;在第二轮面试的过程中&#xff0c;面试官提了一个问题&#xff1a;“解释下Java项目中为什么要求多用组合&#xff0c;少用继承&#xff1f;”。朋友觉得这个题目既熟悉&#xff0c;又陌生&…

【LeetCode】504. 七进制数

504. 七进制数&#xff08;简单&#xff09; 方法一&#xff1a;七进制数预处理 思路 这里我利用了提示&#xff0c;得知 |num| < 10^7 &#xff0c;因此所使用到的七进制数肯定也小于等于 107 &#xff0c;我将 7 的次方数算出来&#xff0c;预存在数组 seven 中。 后续…

ADUC834BSZ-ASEMI代理亚德诺ADUC834BSZ原厂芯片

编辑-Z ADUC834BSZ特征&#xff1a; 2个独立ADC&#xff08;16位和24位分辨率&#xff09; 24位无缺失代码&#xff0c;主ADC 21位rms&#xff08;18.5位p-p&#xff09;有效分辨率20 Hz 偏移漂移10 nV/C&#xff0c;增益漂移0.5 ppm/C 62 KB片上闪存/EE程序存储器 4 KB…

C++(Qt)读取.mat文件(可以读取多级变量)

全网最全&#xff0c;从安装环境和配置环境变量&#xff08;配置环境变量是大坑&#xff09;&#xff0c;然后再到需要的SDK库&#xff0c;再到代码详细解读。 首先就是需要安装matlab&#xff0c;注意&#xff1a;你使用的编译器版本需要和MATLAB版本相互兼容&#xff01;&am…

使用模板构建泛型栈

目录 一.构造栈 使用构造函数 代码&#xff1a; 二.销毁栈 使用析构函数 代码 三.判空&#xff0c;判满 四.扩容 代码 五.入栈&#xff0c;出栈 代码 六.取栈顶元素 代码 代码合集 template< class T>模板 T为当前栈的数据类型 栈类型有三个属性&#x…

Linux:概述 、安装 、文件与目录结构 、vim编辑器 、网络配置 、远程登录 、系统管理 、基础命令 、软件包管理 、克隆虚拟机 、shell编程

1、课程介绍 2、Linux概述(入门篇) 2.1、Linux的诞生 2.1.1、Linux是什么? Linux是一个操作系统&#xff08;OS&#xff09; 所谓的操作系统就是直接用来操作计算机底层硬件的软件。 2.1.2、Linux的出现 2.2、Linux和Unix的渊源 2.3、GNU/Linux 2.4、Linux VS Windows 3、…

机器学习期末复习 决策树ID3的计算与构建

ID3构建的流程就是参考书上的那个伪代码。 1&#xff09; 开始&#xff1a;构建根节点&#xff0c;将所有训练数据都放在根节点&#xff0c;选择一个最优特征&#xff0c;按着这一特征将训练数据集分割成子集&#xff0c;使得各个子集有一个在当前条件下最好的分类。 2&#xf…

愿力,心力,能力

愿力&#xff0c;心力&#xff0c;能力 三力合一成点事 趣讲大白话&#xff1a;人与人的力量差别大 【趣讲信息科技165期】 *************************** 愿力是人文东方智慧 西方大概是mission使命之类 比如佛家发愿 儒家大概类似于立志 心力也是人文东方智慧 西方大概是意志…

51单片机(十七)红外遥控(外部中断)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

基于ssm的汽车服务平台

基于ssm的汽车售后服务平台 快速链接 基于ssm的汽车售后服务平台功能模块技术栈硬件环境功能截图 功能模块 用户 注册功能&#xff1a;用户通过注册功能进行访问平台预约服务功能&#xff1a;用户可以预约服务预约记录查询&#xff1a;用户可以查询自己预约记录也可以进行修改…

AIGPT中文版(人人都能使用的GPT工具)生活工作的好帮手。

AIGPT简介 AIGPT是一款非常强大的人工智能技术的语言处理工具软件&#xff0c;它具有 AI绘画 功能、AI写作、写论文、写代码、哲学探讨、创作等功能&#xff0c;可以说是生活和工作中的好帮手。 我们都知道使用ChatGPT是需要账号以及使用魔法的&#xff0c;其中的每一项对我们…

【框架源码】Spring底层IOC容器加入对象的方式

1.Spring容器加入对象方式简介 使用XML配置文件 在XML配置文件中使用< bean >标签来定义Bean&#xff0c;通过ClassPathXmlApplicationContext等容器来加载并初始化Bean。 使用注解 使用Spring提供的注解&#xff0c;例如Component、Service、Controller、Repository等注…

学习Python的day.14

模块学习 什么是模块&#xff1a; 打开Python解释器&#xff0c;定义了data 1&#xff0c; 然后去访问data是可以访问到的&#xff1b;关闭Python解释器&#xff0c;再打开&#xff0c;再去访问data&#xff0c;访问不到了。 假设我有1000行的代码&#xff0c;在python解释器…

pv操作练习题

信号量解决五个哲学家吃通心面问题 题型一 有五个哲学家围坐在一圆桌旁&#xff0c;桌中央有盘通心面&#xff0c;每人面前有一只空盘于&#xff0c;每两人之间放一把叉子。每个哲学家思考、饥饿、然后吃通心面。为了吃面&#xff0c;每个哲学家必须获得两把叉子&#xff0c;…

【机器视觉1】坐标系定义

坐标系定义 1. 图像坐标系2. 摄像机坐标系3. 世界坐标系4. 三种坐标系间的转换4.1 摄像机坐标系与无畸变图像坐标系之间的变换4.2 世界坐标系与摄像机坐标系之间的变换4.3 世界坐标系与无畸变图像坐标系之间的变换 1. 图像坐标系 数字图像坐标系&#xff1a; O 0 − u v O_0-u…

【差分+操作】C. Helping the Nature

Problem - 1700C - Codeforces 题意&#xff1a; 思路&#xff1a; 一开始手玩了一下 如果不是高低高的形式&#xff0c;那么一定不能通过操作3把全部元素变成0 因此就是先把所有元素变成高低高的形式 但是低在什么地方不确定 因此考虑枚举中间低谷位置&#xff0c;O(1)计…

【多微电网】基于粒子群优化算法的面向配电网的多微电网协调运行与优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

软件测试岗,4轮成功拿下字节 Offer,面试题复盘(附答案)

一共经历了四轮面试&#xff1a;技术4面&#xff0b;HR面。 特整理出所涉及的全部知识点&#xff0c;并复盘了完整面试题及答案&#xff0c;分享给大家&#xff0c;希望能够帮到一些计划面试字节的朋友。 一、测试基础理论类 怎么编写案例?软件测试的两种方法测试结束的标准…