「C++ 类和对象篇 12」static成员

目录

一、static成员是什么?

二、为什么需要static成员? 

三、怎么使用static成员?

1. 定义static成员变量 

2. 定义static成员函数 

3. 访问static成员

四、特性

【面试题】

【总结】 


一、static成员是什么?

       被static修饰的类成员称为类的静态成员:用static修饰的成员变量,称之为静态成员变量;用static修饰成员函数,称之为静态成员函数


二、为什么需要static成员? 

我们如何能快速的知道一个类有多少个对象?其中一个方法就是通过static成员来计算:

//我们如何能快速的知道一个类有多少个对象?其中一个方法就是通过static成员来计算:
#include<iostream>
using std::cin; using std::cout; using std::endl;class A{
public:A(){count++;}A(const A& a){count++;}void PrintC(){cout << count << endl;}
private:static int count;
};int A::count = 0;int main()
{A a, b;A c(a);a.PrintC();  // 结果为3。return 0;
}

         从以上例子可看出,static成员的一个作用是作为计数器或标志,static成员变量可以用作类的计数器或标志,以跟踪类的实例数量或记录某些类级别的状态。

 static成员的作用:

  1. 共享数据:static成员变量是类的所有实例共享的,它们在所有类的实例之间保持一致。这意味着无论创建多少个类的实例,它们都共享相同的static成员变量。这对于需要在类的所有实例之间共享数据的情况非常有用。

  2. 类级别操作:static成员函数是类的成员函数,而不是实例的成员函数。它们可以在没有类实例的情况下被调用,因为它们不依赖于任何特定的实例数据。这使得它们能够执行类级别的操作,例如访问和修改只与类有关的数据(例如类的计数器)。

  3. 避免重复定义:static成员变量和函数可以用来避免重复定义。它们只在类的定义文件中声明一次,而不是在每个实例中定义。

  4. 实现单例模式static成员在实现单例设计模式时非常有用。单例模式确保一个类只有一个实例,并提供一个全局访问点来获取该实例。这通常是通过使用static成员(如静态实例指针和静态获取实例的方法)来实现的。


三、怎么使用static成员?

1. 定义static成员变量 

以下是定义static成员变量的步骤和示例:

  1. 在类声明中声明static成员变量。(类内要写static)

  2. 在类外部使用类名加作用域限定符::来初始化、访问和修改static成员变量。(类外不需要写static)

class A{
private:static int count;
};int A::count = 0;

2. 定义static成员函数 

        static成员函数可以将声明和定义都写在类中;也可以将声明和定义分离,在类外定义函数体。


eg1. 将声明和定义都写在类中:

class A{
public:static void PC(){cout << 1 << endl;}
};

eg2. 声明和定义分离:

class A{
public:static void P();
};void A::P() // 在类外定义时不需要写static
{cout << count << endl;
}

对于比较短的函数可以直接在类中定义,且在static后加上inline使其成为内联函数。

3. 访问static成员

类静态成员可用 类名::静态成员 或者 对象.静态成员 来访问:

class A{
public:static void P1(){cout << 1 << endl;}static int a;
};int A::a = 0;int main()
{// 静态成员可以直接不创建对象直接通过类来访问:A::a = 1;A::P1();// 静态成员也可以通过对象来访问:A b;b.P1();b.a;return 0;
}

四、特性

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

     7.  静态成员函数无法调用非静态成员。

       非静态成员变量或非静态成员函数是属于类的实例的,需要通过实例对象来访问,但是静态成员函数中没有隐式的指向实例对象的this指针,故静态成员函数不可调用非静态成员函数 :

        如果静态成员函数需要访问非静态成员,可以考虑将非静态成员作为参数传入静态成员函数中。


【面试题】

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

        不可以。非静态成员需要通过实例对象来访问。


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

        可以。静态成员函数可以直接通过类来调用,不需要通过实例对象。


【总结】 



------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

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

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

相关文章

品牌之门:概率与潜力的无限延伸

在品牌的世界里&#xff0c;每一个成功的推广都像是打开一扇门&#xff0c;从未知走向已知&#xff0c;从潜在走向显现。这扇门&#xff0c;既是品牌的起点&#xff0c;也是品牌发展的无限可能。 品牌&#xff0c;就像一扇紧闭的门&#xff0c;它静静地矗立在那里&#xff0c;…

微信强制分享红包裂变系统源码

这是一款新型的微信裂变引流系统源码&#xff0c;支持试看、直播、朋友圈转发、分享任务、 邀请入群、群聊、红包等多种裂变引流方式&#xff0c;让你的广告流量引流、吸粉变现更加高效。 该系统源码还优化了整个页面&#xff0c;减少了繁重多余的代码&#xff0c;让访问速度…

【51单片机】直流电机驱动(PWM)(江科大)

1.直流电机介绍 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转 直流电机主要由永磁体(定子)、线圈(转子)和换向器组成 除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等 2.电机驱动…

对(一维)数组与指针的深入理解(1)

目录 1.数组名的理解2.使用指针访问&#xff08;一维&#xff09;数组3.&#xff08;一维&#xff09;数组传参的本质 1.数组名的理解 以前我们在使用指针访问数组内容时&#xff0c;有这样的代码&#xff1a; #include <stdio.h>int main() {int arr[10] { 1,2,3,4,5…

详解Qt多线程(包含:什么是CPU,单核处理器和多核处理器,举餐厅和QQ音乐的例子详解进程和线程,Qt多线程案例)

目录 一.什么是CPU&#xff1f;二.单核处理器与多核处理器三.什么是进程和线程&#xff1f;3.1 定义3.2 以餐厅为例子解释进程和线程3.2 以QQ音乐为例子&#xff0c;解释QQ音乐里面的进程和线程 四.Qt中的多线程五.Qt多线程案例任务描述案例演示设置显示内容的字体大小和位置运…

pands常用操作

1.导入库和文件读取和文件分信息分析 import pandas as pd import numpy as np csvf pd.read_csv(D:/各个站程序版本说明.csv) csvf.info() <class pandas.core.frame.DataFrame> RangeIndex: 51 entries, 0 to 50 Data columns (total 6 columns):# Column Non-Nul…

java面试题整理

2023.2.14&#xff08;第二天&#xff09; 数组是不是对象&#xff1f; 在Java中&#xff0c;数组是对象。数组是一种引用类型&#xff0c;它可以存储固定大小的相同类型的元素序列。在Java中&#xff0c;数组是通过new关键字创建的&#xff0c;它们在内存中被分配为对象&…

「数据结构」MapSet

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;Java数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; Map&Set &#x1f349;概念&#x1f349;模型&#x1f349;Map&#x1f34c;TreeMap和HashMap的区别&#x1f34c;Map常用方…

2048游戏C++板来啦!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习如何用C编写一个2048小游戏。 文章目录 1.2048的规则 2.步骤实现 2.1: 初始化游戏界面 2.1.1知识点 2.1.2: 创建游戏界面 2.2: 随机…

Days 31 ElfBoard 自启脚本中打开看门狗

1.在开机自启脚本中打开看门狗 rootELF1:~# vi /etc/rc.local 2.在自启脚本中添加上之后&#xff0c;然后在咱们的QT界面中找到看门狗应用&#xff0c; 发现显示打开看门狗失败&#xff1a; 3.修改看门狗源码&#xff0c;设置了超时时间后&#xff0c;关闭/dev/dev/watchdog节…

【Tomcat】:One or more listeners failed to start.报错解决方案

报错信息:One or more listeners failed to start. Full details will be found in the appropriate container log file. 具体就是web.xml此配置报错: 服务器启动错误Tomcat:One or more listeners failed to start.报错解决方案 IDEA:在使用IDEA运行SSM项目的时候 , Tomcat运…

error MSB8008: 指定的平台工具集(v143)未安装或无效。请确保选择受支持的 PlatformToolset 值解决办法

右击解决方案&#xff0c;选择属性 将工具集为143的修改为其他&#xff0c;如图 重新编译即可运行

网络原理(3)--以太网协议,DNS

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网络原理(3)–以太网协议,DNS 在网络原理(2)中介绍了网络层中的一个重要的协议–ip协议,网络层关注的通信时的起点和终点,而数据链路层更加"底层"一些,关注的是传输过程…

【Effective Objective - C 2.0】——读书笔记(四)

文章目录 二十三、通过委托与数据源协议进行对象间通信二十四、将类的实现代码分散到便于管理的数个分类之中二十五、总是为第三方的分类名称加前缀二十六、切勿在分类里面声明属性二十七、使用“class-continuation分类”隐藏实现细节二十八、通过协议提供匿名对象 二十三、通…

springboot187社区养老服务平台的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

MySQL 基础知识(六)之数据查询(一)

目录 1 基本查询 1.1 查询相关列 (select * / 列名) 1.2 别名 (as) 1.3 去重 (distinct) 1.4 对列中的数据进行运算 (、-、*、/) 2 条件查询 (where) 2.1 等值查询 () 2.2 非等值查询 (>、<、>、<、!、><) 2.3 逻辑判断 (and、or、not) 2.4 区间判…

源码推荐:hello-algo @ github

github https://github.com/krahets/hello-algo 本项目旨在创建一本开源、免费、对新手友好的数据结构与算法入门教程。全书采用动画图解&#xff0c;结构化地讲解数据结构与算法知识&#xff0c;内容清晰易懂&#xff0c;学习曲线平滑。算法源代码皆可一键运行&#xff0c;支…

上位机图像处理和嵌入式模块部署(借鉴与学习)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于很多学院派的同学来说&#xff0c;他们对市场的感觉一般是比较弱的。如果写一个软件的话&#xff0c;或者说开发一个项目的话&#xff0c;他们…

(一)【Jmeter】JDK及Jmeter的安装部署及简单配置

JDK的安装和环境变量配置 对于Linux、Mac和Windows系统&#xff0c;JDK的安装和环境变量配置方法略有不同。以下是针对这三种系统的详细步骤&#xff1a; 对于Linux系统&#xff1a; 下载适合Linux系统的JDK安装包&#xff0c;可以选择32位或64位的版本。 将JDK的安装包放置…

VueCLI核心知识3:全局事件总线、消息订阅与发布

这两种方式都可以实现任意两个组件之间的通信 1 全局事件总线 1.安装全局事件总线 import Vue from vue import App from ./App.vueVue.config.productionTip false/* 1.第一种写法 */ // const Demo Vue.extend({}) // const d new Demo()// Vue.prototype.x d // 把Dem…