C++:类中的静态成员函数以及静态成员变量

一、静态成员变量


        静态成员:在类定义中,它的成员(包括成员变量和成员函数),这些成员可以用关键字static声明为静态的,称为静态成员。

  1. 静态成员变量需要在类外分配空间,static 成员变量是在初始化时分配内存的,程序结束时释放内存。
  2. 静态成员函数只能访问静态成员函数和静态成员变量,没有this指针。
  3. 静态成员是整个类共有的,通过对象名和类名都可以访问,不计入类的字节数。
  4. 在一个类中,若将一个成员变量声明为static,这种成员称为静态成员变量。静态成员变量,属于某个类,所有对象共享。
  5. 静态变量,是在编译阶段就分配空间,对象还没有创建时,就已经分配空间。
  6. 静态成员变量必须在类中声明,在类外定义,static 成员变量属于类,不属于某个具体的对象。static 成员变量必须在类声明的外部初始化。
  7. 静态数据成员不属于某个对象,在为对象分配空间中不包括静态成员所占空间。
  8. 静态数据成员可以通过类名或者对象名来引用。
  9. 在编译阶段分配内存,存储于全局区,。
  10. 所有对象共享一份数据,因此不属于特定哪个某个对象。(非静态成员变量隶属于特定的对象)类内声明,类外初始化。
     

//静态成员变量:在一个类中,在一个成员变量前面加static,在类中声明,类外定义
 
class Person
{
public:
    static int m;//类内声明
 
};
 
int Person::m = 10; //类外初始化
 
void test()
{
    Person p1;
    p1.m = 20;
    cout << p1.m << endl; //通过对象访问
    cout << Person::m << endl; //通过类名访问
}
int main()
{
    test();
    return 0;
}

二、静态成员函数


C++会区分两种类型的成员函数:静态成员函数非静态成员函数。这两者之间的一个重大区别是,静态成员函数不接受隐含的 this 自变量。所以,它就无法访问自己类的非静态成员。

静态成员函数: 在类定义中,前面有static说明的成员函数称为静态成员函数。静态成员函数使用方式和静态变量一样,同样在对象没有创建前,即可通过类名调用。静态成员函数主要为了访问静态变量,但是,不能访问普通成员变量。 静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员,完成对静态数据成员的封装。

  1. 静态成员函数只能访问静态变量,不能访问普通成员变量。
  2. 静态成员函数的使用和静态成员变量一样。
  3. 静态成员函数也有访问权限。
  4. 普通成员函数可访问静态成员变量、也可以访问非经常成员变量。
  5. 所有对象共享同一个函数,因此不属于特定哪个某个对象。
  6. 静态成员函数只能访问静态成员变量。

 
//静态成员函数
class Person
{
public:
    static void fun()
    {
        cout << "调用fun" << endl;
    }
};
 
void test()
{
    Person p1;
    p1.fun();  //通过对象调用
    Person::fun();//通过类调用
}
int main()
{
    test();
    return 0;
}

//静态函数只能访问静态变量,不能访问非静态变量。
 
class Person
{
public:
    static int m;
    int n;
    static void fun()
    {
        cout << "调用fun" << endl;
        m = 10;  //静态函数只能访问静态变量
        //n = 10;   报错,静态函数不能访问非静态变量
    }
};

三、this 指针

        静态成员函数无需通过对象调用(类名即可),但非静态成员函数必须通过特定对象来调用,当实例化出来的对象调用该函数时,this指针会指向该对象,即this指针指向被调用的成员函数所属的对象!。自然也可以为非静态成员变量_b提供特定对象了(this指针嘛)。而静态成员函数没有this指针,编译器也不知道你要访问哪个_b,当然会出错了!

        有人会问静态成员函数不会自动提供this指针吗?答案终于是否定了。我们假设它会自动提供this指针的话…那么静态成员函数如果用类名(作用域)这种方式访问的话,没有创建任何对象哦,那请问this指针指向谁?逻辑上行不通了。

        所以静态成员函数只能老老实实访问静态成员变量,反正静态成员变量不属于任何对象,正好静态成员函数也不能提供任何对象!上面代码注释行是行得通的!

//static int sta_display() { return s_a; }

四、静态成员函数以及静态成员变量总结

#include <iostream>
using namespace std;
#include <string>
class Person
{
public:
    Person(int a) :m_A(a) {}
    int m_A;
    static int m_B;
    static void show()
    {
        cout <<"静态成员函数show的调用m_B="<< m_B << endl;//静态成员函数访问静态成员变量
    }
    static void fun()
    {
        cout << "静态成员函数fun的调用" << endl;
        show();//静态成员函数调用静态成员函数
    }
};
int Person::m_B = 10;//类外分配空间,在全局区
int main()
{
    Person p(15);
    p.fun();//对象调用
    Person::fun();//类名调用
    cout << sizeof(p) << endl;
    //静态变量,是在编译阶段就分配空间,对象还没有创建时,就已经分配空间。
    //静态成员变量必须在类中声明,在类外定义。
    //静态数据成员不属于某个对象,在为对象分配空间中不包括静态成员所占空间。
    return 0;
}

运行结果:

静态成员函数fun的调用
静态成员函数show的调用m_B=10
静态成员函数fun的调用
静态成员函数show的调用m_B=10
4

类结构:

class Person    size(4):
        +---
 0      | m_A
        +---
 

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

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

相关文章

【解决方案】edge浏览器批量添加到集锦功能消失的解决方案

edge的集锦功能很好用&#xff0c;右键标签页会出现如下选项&#xff1a; 但在某次edge更新后&#xff0c;右键标签页不再出现该选项&#xff1a; 这里可以参考为什么我的Edge浏览器右键标签页没有“将所有标签页添加到集锦”功能&#xff1f; - Microsoft Community 一文提出…

pcl--第十节 点云曲面重建

曲面重建技术在逆向工程、数据可视化、机器视觉、虚拟现实、医疗技术等领域中得到了广泛的应用 。 例如&#xff0c;在汽车、航空等工业领域中&#xff0c;复杂外形产品的设计仍需要根据手工模型&#xff0c;采用逆向工程的手段建立产品的数字化模型&#xff0c;根据测量数据建…

超级好用绘图工具(Draw.io+Github)

超级好用绘图工具&#xff08;Draw.ioGithub&#xff09; 方案简介 绘图工具&#xff1a;Draw.io 存储方式&#xff1a; Github 1 Draw.io 1.2 简介 ​ 是一款免费开源的在线流程图绘制软件&#xff0c;可以用于创建流程图、组织结构图、网络图、UML图等各种类型的图表。…

windows server 2019 、2012等服务器查看系统和应用程序日志

查看windows系统日志 点击左下角的windows按钮&#xff0c;输入事件两个字&#xff0c;会显示时间查看器 点击事件查看器&#xff0c;windows日志下面可以卡到系统日志和应用程序的日志 筛选时间范围内的日志 修改记录时间 选组自定义范围 选择事件事件 输入事件范围&#xff…

C语言大佬的必杀技---宏的高级用法

C语言大佬的必杀技—宏的高级用法 目录: 字符串化标记的拼接宏的嵌套替换多条语句防止一个文件被重复包含宏和函数的区别 可能大家在学习的时候用得比较少&#xff0c;但是在一些代码量比较大的时候&#xff0c;这样使用&#xff0c;可以大大的提高代码的可读性&#xff0c;…

从零开始:新手快速在国产操作系统中搭建高可用K8S(V1.28)集群落地实践

微信改版了&#xff0c;现在看到我们全凭缘分&#xff0c;为了不错过【全栈工程师修炼指南】重要内容及福利&#xff0c;大家记得按照上方步骤设置「接收文章推送」哦~ 关注【公众号】回复【学习交流群】加入【SecDevOps】学习交流群! 文章目录&#xff1a; 本文为作者原创文章…

day03_基础语法

今日内容 零、复习昨日 一、Idea安装&#xff0c;配置 二、Idea使用 三、输出语句 四、变量 五、数据类型 附录: 单词 零、 复习昨日 1 装软件(typora,思维导图) 2 gpt(学会让他帮你解决问题) 3 java发展(常识) 4 HelloWorld程序 5 编码规范 6 安装jdk,配置环境变量 电脑常识 任…

STM32-无人机-电机-定时器基础知识与PWM输出原理

电机控制基础——定时器基础知识与PWM输出原理 - 掘金单片机开发中&#xff0c;电机的控制与定时器有着密不可分的关系&#xff0c;无论是直流电机&#xff0c;步进电机还是舵机&#xff0c;都会用到定时器&#xff0c;比如最常用的有刷直流电机&#xff0c;会使用定时器产生PW…

在GIS(地理信息系统)中,常见的地理文件记录

在GIS&#xff08;地理信息系统&#xff09;中&#xff0c;常见的地理文件包括以下几种&#xff1a; .cpg&#xff08;Code Page文件&#xff09;&#xff1a;这个文件是指定地理数据文件编码的文件&#xff0c;它告诉软件如何正确地读取和解释地理数据文件中的字符编码。比如…

海外代理IP是什么?如何使用?

一、海外代理IP是什么&#xff1f; 首先&#xff0c;代理服务器是在用户和互联网之间提供网关的系统或路由器。它是一个服务器&#xff0c;被称为“中介”&#xff0c;因为它位于最终用户和他们在线访问的网页之间。 海外IP代理是就是指从海外地区获取的IP地址&#xff0c;用…

Linux学习-HIS系统部署(1)

Git安装 #安装中文支持&#xff08;选做&#xff09; [rootProgramer ~]# echo $LANG #查看当前系统语言及编码 en_US.UTF-8 [rootProgramer ~]# yum -y install langpacks-zh_CN.noarch #安装中文支持 [rootProgramer ~]# vim /etc/locale.co…

差值结构的顺序偏好

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由5张二值化的图片组成&#xff0c;让A 中有5个点&#xff0c;B中有1个点&#xff0c;且不重合&#xff0c;统计迭代次数并排序。 第一种情况 差值结构 迭代次数 L E - - 2 10491.…

python随手小练1

题目&#xff1a; 使用python做一个简单的英雄联盟商城登录界面 具体操作&#xff1a; print("英雄联盟商城登录界面") print("~ * "*15 "~") #找其规律 a "1、用户登录" b "2、新用户注册" c "3、退出系统&quo…

手动部署 OceanBase 集群

手动部署一个 OB 单副本集群&#xff0c;包括一个 OBProxy 节点 部署环境 服务器信息 IP地址 192.168.0.26 网卡名 ifcfg-enp1s0 OS Kylin Linux Advanced Server release V10 CPU 8C 内存 32G 磁盘1 本地盘 /data/1 磁盘2 本地盘 /data/log1 机器和角色划分 …

es小记(copy_to)

简单创建索引复制字段 1: 3个主分片,各自有一个副本,总分片数为 3*26; refresh_interval为刷新频率; 其他参数描述,转载自 PUT test1 { “settings”:{ “number_of_shards”: 1, “number_of_replicas”: 1, “refresh_interval”: “30s” }, “mappings”:{ “properties”…

软件工程知识总结梳理

&#x1f525;&#x1f525;宏夏Coding网站&#xff0c;致力于为编程学习者、互联网求职者提供最需要的内容&#xff01;网站内容包括求职秘籍&#xff0c;葵花宝典&#xff08;学习笔记&#xff09;&#xff0c;资源推荐等内容。在线阅读&#xff1a;https://hongxiac.com&…

ubuntu20.04 安装 pyconcorde

这个包似乎对网络环境要求挺高的&#xff0c;我们直接弄个 射线A型号 的飞机 直接使用 pip install pyconcorde 安装&#xff0c;发现在使用里面的包时会报奇怪的错误&#xff0c;于是决定寻找 github 上的 pyconcorde 源码&#xff0c;看文档进行安装 github 地址&#xff1…

计算π的近似值分数 ——python

利用格里高利公式&#xff1a; 计算 的近似值&#xff0c;直到最后一项的绝对值小于给定精度eps。 输入格式: 输入小于1且大于0的阈值。 输出格式: 输出满足阈值条件的近似圆周率&#xff0c;输出到小数点后6位。 输入样例: 在这里给出一组输入。例如&#xff1a; 0.0…

分布式锁演进-基本原理与使用

文章目录 前言一、分布式锁演进1.1 分布式锁特点1.2 阶段一1.3 阶段二1.4 阶段三1.5 阶段四 前言 在单体应用下当多线程去竞争某一共享资源时&#xff0c;我们通常会用一把锁来保证只有一个线程获取到资源。如加上 synchronize 关键字或 ReentrantLock 锁等操作。 在分布式应用…

一篇文章让你学会什么是哈希

一篇文章让你学会什么是哈希 哈希概念哈希冲突哈希函数1. 直接定址法2. 除留余数法3. 平方取中法4. 折叠法5. 随机数法6. 数学分析法 哈希冲突解决1. 闭散列1.1 线性探测1.2 二次探测 2. 开散列 开散列和闭散列对比 哈希概念 哈希在C中有广泛的应用&#xff0c;它是一种用于快…