类的静态成员函数和静态数据成员

C++操作题-定义一个Cat类体会静态数据成员和静态成员函数的用法 【问题描述】定义一个Cat类,拥有数据成员itsAge记载Cat的年龄;静态数据成员HowManyCats,记录Cat的个体数目;静态成员函数GetHowMany(),存取HowManyCats。设计程序测试这个类,体会静态数据成员和静态成员函数的用法。 【输入形式】无 【输出形式】 【样例输入】无 【样例输出】 Cat1age=1 There are 1 cats alive! Cat2age=2 There are 2 cats alive! Cat3ag 阅读详情

一、基本知识

当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关。静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关。

静态数据成员的用途之一是统计有多少个对象实际存在。

静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化。

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值。

静态成员的值对所有的对象是一样的。静态成员可以被初始化,但只能在类体外进行初始化。

一般形式:

    数据类型  类名::静态数据成员名=初值

注意:不能用参数初始化表对静态成员初始化。一般系统缺省初始为0。

静态成员是类所有的对象的共享的成员,而不是某个对象的成员。它在对象中不占用存储空间,这个属性为整个类所共有,不属于任何一个具体对象。所以静态成员不能在类的内部初始化,比如声明一个学生类,其中一个成员为学生总数,则这个变量就应当声明为静态变量,应该根据实际需求来设置成员变量。

#include <iostream>

using namespace std;
class test
{
private:
    int x;
    int y;
public:
    static int num;
    static int GetNum()
    {
        //x += 5; //错误,静态成员函数不能调用非静态数据成员,要通过类的对象来调用。
        num += 15;
        return num;
    }
};
int test::num = 10;//在类体外对静态数据成员初始化
int main()
{
    test a;
    cout<<test::num<<endl;//10
    test::num = 20;//在类体外对静态数据成员再次赋值
    cout<<test::num<<endl;//20
    cout<<test::GetNum()<<endl;//35
    cout<<a.GetNum()<<endl;//50
    return 0;
}

通过上例可知:

x+=5;   // 这行代码是错误的
静态函数成员必须通过对象名来访问非静态数据成员。
另外,静态成员函数在类外实现时候无须加static关键字,否则是错误的。

若在类的体外来实现上述的那个静态成员函数,不能加static关键字,这样写就可以了:

  int test::Getnum()
  {
      .........
  }

1、static成员的所有者是类本身和对象,但是多有对象拥有一样的静态成员。从而在定义对象是不能通过构造函数对其进行初始化。
2、静态成员不能在类定义里边初始化,只能在class body外初始化。
3、静态成员仍然遵循public,private,protected访问准则。
4、静态成员函数没有this指针,它不能返回非静态成员,因为除了对象会调用它外,类本身也可以调用。
5、静态成员函数可以直接访问该类的静态数据和函数成员,而访问非静态数据成员必须通过参数传递的方式得到一个对象名,然后通过对象名来访问。
6、设定了静态成员变量,必须要为其赋初值。

二、静态成员函数访问非静态成员

类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。

在一个类的静态成员中去访问其非静态成员之所以会出错,是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。

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

例1:

#include <iostream>

using namespace std;
class test
{
private:
    int x;
    int y;
public:
    static int GetX()
    {
        //x += 5; //错误,静态成员函数不能调用非静态数据成员,要通过类的对象来调用。
        test *p = new test;// new一个类的对象!!!!
        p->x = 222;//使用类的对象调用非静态数据成员!!!!
        p->func();//使用类的对象调用非静态成员函数!!!!
        return p->x;
        delete p;//使用完后delete!!!!
    }
    void func(){cout<<"func()被静态成员函数调用"<<endl;}
};
int main()
{
    test a;

    cout<<a.GetX()<<endl;

    return 0;
}

结果:

func()被静态成员函数调用
222

Process returned 0 (0x0)   execution time : 0.212 s
Press any key to continue.

例2:

#include <iostream>
using namespace std;

class M
{
public:
     M(int a) {A = a; B += a;}
     ~M(){}
     static void f1();
private:
     int A;
     static int B;
};

void M::f1()
{
     M m(5); //定义并初始化类对象
     cout<<"A="<<m.A<<endl; //静态成员函数中通过对象来引用非静态成员
     cout<<"B="<<B<<endl;
}
int M::B=5; //静态数据成员初始化的格式<数据类型><类名>::<静态数据成员名>=<值>

int main()
{
     M::f1(); //静态成员函数调用时不用对象名
     return 0;
}

结果:

A=5
B=10

Process returned 0 (0x0)   execution time : 0.273 s
Press any key to continue.

三、访问私有静态成员数据

如果把静态成员数据设为私有,可以通过公有静态成员函数!!!!!访问。

#include <iostream>

using namespace std;

class Cat
{
public:
    Cat(int age):itsAge(age){HowManyCats++;}
    virtual ~Cat(){HowManyCats--;}
    virtual int getAge(){return itsAge;}
    virtual void setAge(int age){itsAge=age;};
    static int getHowMany()
    {//公有静态成员函数!!!!!!!!
        return HowManyCats;//访问私有静态成员数据!!!!!
    }
private:
    int itsAge;
    static int HowManyCats;
};
int Cat::HowManyCats=0; //对静态成员数据如此赋值
int main()
{
    const int maxCats =5;
    Cat *catHouse[maxCats];

    for(int i=0; i<maxCats; i++)
        catHouse[i]=new Cat(i);
    for(int i=0; i<maxCats; i++)
    {
        cout<<"there are "<<Cat::getHowMany();//公有静态成员函数!!!
        cout<<" cats left!"<<endl;
        if(!Cat::getHowMany()) break;
        cout<<"delete the cat which is "<<catHouse[i]->getAge()<<" years old."<<endl;
        delete catHouse[i];
        catHouse[i] = 0;
    }
    return 0;
}

结果:

there are 5 cats left!
delete the cat which is 0 years old.
there are 4 cats left!
delete the cat which is 1 years old.
there are 3 cats left!
delete the cat which is 2 years old.
there are 2 cats left!
delete the cat which is 3 years old.
there are 1 cats left!
delete the cat which is 4 years old.

Process returned 0 (0x0)   execution time : 0.409 s
Press any key to continue.
PCL 计算点云包围球【2025最新版】 包围球通常用于简单排斥,因为与球体相交的方程很简单,同样重要的是,旋转一个球体并不会改变其范围。因此,当包围球用于简单排斥时,如果球体中心是对象的原点,则可以忽略对象的方向。 阅读详情

相关推荐

SLAM工程师面试避坑指南:2025年最新高频考点与实战代码解析

本文为SLAM工程师提供2025年最新面试避坑指南,涵盖高频技术考点如VINS初始化、三维几何处理、多传感器融合架构设计等,并包含实战代码解析。特别针对算法工程师面试中的常见陷阱,提供系统设计框架和代码模板,帮助求职者提升通过率。

metaverse5vr的博客 246

3.7——静态成员

3.7 静态成员

m0_73850645的博客 630

大众点评爬虫实战:如何用Python绕过反爬机制获取评论数据(附完整代码)

本文深入探讨了2024年使用Python进行大众点评数据采集的实战策略。文章详细解析了现代反爬机制的核心逻辑,并提供了从构建拟人化请求会话、应对动态内容与接口加密,到工程化实践(代理调度、状态持久化)的完整解决方案与代码示例,旨在帮助数据分析师稳健获取评论数据,用于后续的文本挖掘与商业洞察。

weixin_29084111的博客 1919

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

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

森明帮大于黑虎帮的博客 8371

别再手动连线了!用Tessent IJTAG的SIB和TDR,5分钟搞定复杂芯片的DFT网络分区

本文探讨了如何利用Tessent IJTAG的SIB(Segment Insertion Bit)和TDR(Test Data Register)技术,高效解决复杂芯片DFT网络分区问题。通过智能化的扫描链管理和声明式定义,显著降低连接复杂度,提升测试覆盖率和良率,适用于超大规模SoC设计。

weixin_29251131的博客 300

INCA基础教程

以软件自带Demo为例记录INCA学习过程,主要内容包括测量与标定。

yunqianrui的博客 6万+

类的静态数据成员和类的静态成员函数

类的静态成员       采用static关键字来声明静态成员,静态成员在每个类中只有一个拷贝,由该类的所以对象共同使用和维护,从而实现在同一个类中不同对象间的数据共享。               用法:类名::标识符      对于静态数据成员,必须在文件作用域内采用类名限定对静态数据成员定                 对于静态函数成员与静态数据成员一样用static关键字声明 ,属于整个...

weixin_41852440的博客 1542

电磁阀的符号解读

先数方框数量定“几位”(工作位置数 );数接口数量(P、A、R等 )定“几通”;看箭头、截断符号,结合常态位(弹簧侧/中间位 ),分析通电/断电时的通路切换;字母(P、A、R )、线圈(单/双电控 )、弹簧(复位 )辅助确认功能(如NO/NC对应常态通断 )。不同厂家符号细节(如编码、线圈画法 )有差异,遇到陌生符号,建议结合产品手册、品牌规范核对,就能精准读懂电磁阀的“语言”啦~

创新改变世界! 6893

[C++] 类的静态成员 (静态数据成员 和 静态成员函数)

目录 一、声明静态成员: 二、定义静态成员: 三、使用类的静态成员: 四、静态成员类内初始化: 五、静态成员与普通成员的区别: 六、案例代码: 类内的静态成员包括:静态数据成员和静态成员函数。 类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据。 一、声明静态成员: 在成员(函数或变量 )声明之前加上关键字static。 静态成员可以是 public或private的。 静态数据成员的 类型 可以是常量、引用、指针、类类型等。 cl...

Appleeatingboy的博客 4257

从频谱入手搞定ESD:手把手教你用示波器和频谱仪分析静电干扰(以Type-C接口为例)

本文详细介绍了如何利用示波器和频谱仪分析Type-C接口的ESD干扰问题。通过频谱特性分析、耦合路径诊断和实战测试,提供了一套完整的ESD防护方案,包括三级防护设计和器件选型建议,帮助工程师有效解决静电放电导致的系统故障。

weixin_42662293的博客 344

【过检测】2026调试级去虚拟化虚拟机成品

EternalBlaze调试级虚拟机是由恒烈开发的定制化VMware环境,适用于逆向工程、病毒分析等专业场景。该虚拟机基于Windows 10 1909专业版,预装Python/JDK等开发环境和逆向工具包,支持快照回溯功能。特色包括:一键去虚拟化方案、双机调试支持、驱动开发环境等。适用场景涵盖CTF竞赛、软件调试、病毒行为分析等,但不支持DX12游戏和视频盗录。使用前需按步骤关闭安全中心、安装特定VMware版本并执行去虚拟化操作。虚拟机提供基础版和逆向调试增强版两种配置,均预装必要工具链。(149字)

Heng_lie的博客 2667

类的静态数据成员和静态成员函数浅析

一、静态数据成员        类中的数据成员声明前加上static,则表示该数据成员为静态数据成员。除了与其他数据具有相同的public/private/protect访问属性外,还有一些其他的属性:        1、不能在类中进行初始化,只能在类外。           因为静态数据成员为所有类对象公有(包括派生类),不占用类对象的存储空间。若在类中初始化,容易造成对其他对象中该数

HQ的专栏 1965

PCL RANSAC拟合分割多条直线【2026最新版】

使用RANSAC算法拟合分割多条直线,输出每一条直线的拟合参数到控制台,并保存直线点云到本地文件夹。博客长期更新,本文最新更新时间为:2026年5月24日。

点云侠的博客 7974

C++类的静态数据成员和静态成员函数

一些类对象可能会具有一些相同的属性,如果用普通数据成员来描述这些相同的属性,这意味着我们需要给每个对象的这个数据成员设定相同的值,如果改变类对象相同的属性,那么意味着我们需要对它们统一操作,这就有可能出现它们的值会不一样的情况,如果用全局变量来描述它们相同的属性,就会破坏类的独立性。 因此,C++提供了静态数据成员来描述类对象相同的属性。 静态数据成员 类的静态数据成员是属于这个类的,而不是属于某个对象的。 我们定义一个手机类来说明一下: class redmik30pro { p...

笔记 2243

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

面向对象程序设计 类 静态数据成员和静态成员函数

需要注意的问题: 1、什么样的数据成员可以被定义为静态的?对该类所有的对象的值都是一样的。 2、如果成员函数被说明为静态的,该成员函数不再具有this指针,即静态成员函数不与某个具体的对象相联系,它是属于类的。 3、静态数据成员和静态成员函数不是每生成一个对象就产生一个拷贝,所有的对象共用一个。 4、由于静态成员函数没有this指针,所以不能对数据成员进行操作,只能通过对象来访问数据成员。 5、静...

qq_42717239的博客 596

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

学生类(静态数据成员和静态成员函数,即数据的共享)

【问题描述】 定义一个类Student,要求使用静态数据成员或静态成员函数计算5个学生的《计算机导论》课程的总成绩和平均成绩。请同学们自行设计该类。 【提示】 静态数据成员:static int total; 表示所有同学成绩总分 静态成员函数:static void Average(int sum){} 计算sum个学生的平均成绩,主函数在调用的时候采用Student::Average(n)...

Chilan_Yuk的博客 4753

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

静态数据成员和静态成员函数在类中的应用举例

静态数据成员有着和程序一致的生命周期,即当程序开始运行时为其分配一个内存空间,直到程序终止时,内存空间才会被释放。在其整个生命周期内,它的值一直存在,并且在其作用域内可以对其进行读写操作。 #include using namespace std; class CPoint{ private: //私有数据成员 int x,y; static int count; //

ThistleZhang 1426

类的静态数据成员和静态成员函数

一.什么是类的静态成员 静态成员变量和全局变量都存储在全局/静态区,它们都是在程序编译时创建,直到编译结束才被收回.所以全局变量和静态成员变量的功能差不多,只是创建的方式不同,类的静态成员创建在类中,全局变量创建在程序开头. 二.为什么要用类的静态成员而不用全局变量 全局变量在c中得心应手,而在c++中却力不从心.全局变量定义在程序开头,一旦全局变量多了,就会降低程序的可读性,并且这样定义变量会使...

Wj_12345_的博客 1469

0405笔记 类的定义和简单使用 构造函数与复制构造函数 静态数据成员与静态成员函数

private:public://函数声明//函数定义int main()//对象float m, c;i

北邮22级信通一枚 204

objective-c 类和对象中静态数据成员和静态成员函数(类方法)详解

作为初学者,相信大家都对objective-c的静态数据成员和静态成员函数都挺纠结的,我现在和大家分享下我对这个知识点的理解,请大家多多指点.... 如果大家学过C++,那么都应该知道和了解静态数据成员和静态成员函数是怎么声明和使用的;现在就让我来说说objective-c和C++在静态成员在使用和声明上的异同点吧。         首先来说说声明: A:静态数据成员的声明 C++是如下声

ComeOnTom的专栏 1万+

定义一个Cat类,拥有静态数据成员 numOfCats,记录Cat的个体数目;静态成员函数getNumOfCats(),读取numOfCats。设计程序测试这个类,体会静态数据成员和静态成员函数的用法

#include<iostream> using namespace std; class cat { public: cat() { numOfCats++; } static int getNumOfCats() { return numOfCats; } ~cat() { numO.

今天你学习了吗的博客 8078

编写一个程序,设计一个类Score用于统计一个班的学生成绩,其中使用一个静态数据成员sum存储总分和一个静态成员函数getSum返回该总分

头文件名称: 头文件: #include<iostream> using namespace std; class Score { public: int getSum() { return sum; } static int sum; //static是不能初始化的,想要初始化可以这样写 }; //可以在此处对类的静态成员进行初始化,(特殊之处) int Score::sum = 600; 源文件: #include"Score1.h" int ma..

qq1014351846的博客 2751

学生类(静态数据成员和静态成员函数,即数据的共享)C++

【问题描述】 定义一个类Student,要求使用静态数据成员或静态成员函数计算全班学生的《计算机导论》课程的总成绩和平均成绩。请同学们自行设计该类。 【提示】 静态数据成员:static int total; 表示所有同学成绩总分 静态成员函数:static void Average(int sum){} 计算sum个学生的平均成绩,主函数在调用的时候采用Student::Average(n)的形式。 【输入形式】 学生姓名 课程成绩 【输出形式】 总成绩和平均成绩 【样例输入】 Zhang 82 Li

匿名用户 1009
上一篇: 你会解吗? ?+?+?=30 把下面数字填到框里 (1,3,5,7,9,11,13,15)
下一篇: 初始化列表成员变量的初始化
爱橙子的OK绷
博客等级 码龄15年 351粉丝 329原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值