一文详解类的静态成员

C++ 类内静态成员使用方法 静态成员(static member)可以是类的成员变量(静态变量)或成员函数(静态函数)。共享性:所有类的对象共享同一个静态成员,改变其中一个对象的静态成员,所有对象都可以看到变化。独立性:静态成员不依赖于类的具体对象,因此它们不需要通过对象来访问。静态成员函数的定义也需要在类外部进行,使用类名::函数名的方式来实现。静态成员函数的实现与普通成员函数类似,只是它不能访问非静态的成员。public:// 静态成员变量声明static void printCount() { // 静态成员函数定义。 阅读详情
class Circle 
{
private:
	double r;   //半径
	double pi;  //圆周率
public:
	Circle( double _r, double _pi ) : r(_r), pi(_pi)
	{}

	double get_area()   //计算面积 
	{
		return r*r*pi;
	}
};

int main()
{
	Circle c1( 2.0, 3.14 );

	Circle c2( 1.9999, 3.141592 );

	// c1.get_area()  c2.get_area()
}

c2圆的半径要小,但是计算出来的面积却要大一些 
        这个bug的原因在于 两个圆的圆周率pi没有统一 

        double pi;  //圆周率, 不应该是属于某个对象的,而是应该属于这个Circle类的

在设计这个类的时候,有些数据成员,不应该属于某个对象,而应属于这个类的所有的对象
         "属于这个类的"
        该如何设计呢? 
            ---> "类的静态成员"


1.类的静态成员 

1)什么是静态成员?


为了实现类的对象之间的数据共享,同时又能够保证数据的安全, C++提出了静态成员的概念

一个类的所有对象之间共享的数据, 而不是所有对象共享的数据(其他类的对象不能共享的)
保证数据的安全(不能让别人随意修改)

在一个类的声明中, 用 static 修饰 类的成员 ,称之为 类的静态成员 
静态成员变量(静态数据成员)
静态成员函数

例子:
 

class Circle
{
private:
    double r;
    static double pi;   //圆周率 类的 静态成员变量
public: 

    static void set_pi(double _pi)  //修改圆周率pi   类的 静态成员函数 
    {
        pi = _pi;
    }

    double get_area()   //计算面积 
    {
        return r*r*pi;
    }
};


2)静态成员的含义


静态成员 不属于某个对象,而是属于这个类的所有的对象 "属于这个类的"
也就是说 静态成员不管这个类有多个对象(0个或者多个),静态成员只有一份拷贝
静态成员 属于这个类的所有对象共享的

静态成员 又是这个类的所有对象都可以使用的
在这个类的第一个对象创建之前, 所有的静态成员都必须初始化(定义)
why? 因为这个类的第一个对象,一开始就有可能使用到这个静态成员(如:在构造函数中)

如何做到 在创建类的第一个对象之前 就初始化这个静态成员呢? 


3)静态数据成员的初始化 

(1)静态数据成员的初始化, 必须放在类外         "类似于C语言中全局变量的初始化"


静态数据成员的定义(初始化)格式如下: 

类型  类名::静态成员变量名 = 初始值; 

例子: 

double Circle::pi = 3.14;       //Circle类 的静态数据成员pi 的初始化 

(2)静态数据成员的访问 

类名::静态成员名 

也可以通过 对象名和对象指针 去访问静态成员

例子: 

class Circle
{
private:
	double r;
	static double pi;   //圆周率 类的 静态成员变量
public: 
	Circle( double _r ) : r(_r) 
	{}
			
	double get_area()   //计算面积 
	{
		return r*r*pi;
	}
};
//Circle类 的静态数据成员pi 的初始化 
double Circle::pi = 3.14;       

int main()
{
	Circle c1( 2.0 );
	Circle c2( 1.9999 );

	cout << c1.get_area() << endl;
	cout << c2.get_area() << endl;

	cout << sizeof(c1) << endl;		// 8 只存放属于这个对象的非static数据成员
}


4)静态成员函数  


加了 static修饰的成员函数, 称之为 类的静态成员函数 

static void set_pi(double _pi)  //修改圆周率pi   类的 静态成员函数 
{
    pi = _pi;
}

static成员函数 和 非static成员函数 的区别: 


(1)含义上的区别 


加了static修饰的成员函数,属于这个类的,不加static修饰的成员函数属于对象 

static成员函数 没有this指针
在static成员函数中, 不能访问非static数据成员 (非static数据成员属于对象)
                        "某某对象的..."  this->非static成员 

例子: 

(2)访问方式的区别 

    static void set_pi( double _pi )    //类的静态成员函数
    {
        pi = _pi;
        //r = 5.0;    //error    在static成员函数中, 不能访问非static数据成员
                        //没有this指针 
    }


类的非static成员函数, 属于对象, 只能通过 "对象名/对象指针" 去访问 

类的static成员函数, 属于这个类的,同时也是属于这个类的所有对象的
可以通过 "类名::函数名"去访问, 也可以通过"对象名/对象指针" 去访问

例子: 

class Circle
{
private:
    double r;
    static double pi;   //圆周率 类的 静态成员变量
    
public: 
    Circle( double _r ) : r(_r) 
    {}

    static void set_pi( double _pi )    //类的静态成员函数
    {
        pi = _pi;
        //r = 5.0;    //error    在stati成员函数中, 不能访问非static数据成员
                        //没有this指针 
    }
            
    double get_area()   //计算面积 
    {
        return r*r*pi;
    }
};

//Circle类 的静态数据成员pi 的初始化 
double Circle::pi = 3.14;       


int main()
{
    Circle c1( 2.0 );
    Circle c2( 1.9999 );

    cout << c1.get_area() << endl;
    cout << c2.get_area() << endl;

    //静态成员函数的访问
    //c1.set_pi( 3 );
    //c2.set_pi( 2 );
    Circle::set_pi( 4 );    // 类名::静态成员函数名
    
    cout << c1.get_area() << endl;
    cout << c2.get_area() << endl;

}

类的非static成员函数,第一个参数其实是隐含的 this指针 
类的static成员函数, 没有this指针 

类的非static成员函数内部,可以访问非static成员(属于特定的对象的 this)
                        也可以访问static成员(属于这个类的所有对象的)

类的static成员函数内部, 不可以访问非static成员的 
                    只能访问 类的static成员 

=================================
const  只读的 
        const修饰类的成员函数 
            表示在该成员函数中 不能对象类的任何成员进行修改 

    类的非static成员函数 后面可以用const修饰
    类的static成员函数 不能用const修饰 (const其实修饰的this)

    例子: 

class Circle
{
private:
	double r;
	static double pi;   //圆周率 类的 静态成员变量
	
public: 
	Circle( double _r ) : r(_r) 
	{}

	static void set_pi( double _pi )	//类的静态成员函数
	{
		pi = _pi;
		//r = 5.0;	//error	在stati成员函数中, 不能访问非static数据成员
						//没有this指针 
	}

	double get_r() const	//const修饰的成员函数,在该成员函数内部不能对类的任何成员进行修改
	{
		//r = 3.0;	//error
		return r;
	}

	/*
		==>
		double get_r( const Circle *this ) 	//const修饰其实是this
		{
			return this->r;
		}
	*/
			
	double get_area()   //计算面积 
	{
		return r*r*pi;
	}
};

//Circle类 的静态数据成员pi 的初始化 
double Circle::pi = 3.14;       

  


5)静态成员的访问 


(1)通过static成员函数 去访问 static数据成员 (建议) 

(2) 能不能通过 非static成员函数 去访问 static数据成员呢? 
当然也可以 

(3) 能不能通过 static成员函数 去访问 非static数据成员呢? 
不可以, 没有this指针


思考:
static关键字的作用? 

(1) static修饰局部变量, 延长对象的生存期, 变为随进程的持续性, 并且静态局部变量只会初始化一次 
(2) static修饰全局变量, 限制对象的作用域, 变为仅在本文件中使用
(3) static修饰成员变量, 为静态数据成员, 属于这个类的,是这个类的所有对象共享的
(4) static修饰成员函数, 为静态成员函数, 没有this指针, 可以通过类名直接调用

29、类的静态成员详解 本文详细介绍了C++中类的静态成员变量和静态成员函数的概念、声明与使用方法,以及它们在实际编程中的应用场景和注意事项。通过实例代码演示了静态成员在实例计数、工具函数、资源共享等方面的应用,并探讨了静态成员的内存模型、生命周期、线程安全性等问题。 阅读详情

相关推荐

先进半导体材料与器件Chapter3

Chapter3 异质结双极晶体管(HBT) 作者:毛茏玮 / Saint 掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a 微博:https://weibo.com/5458277467/profile?topnav=1&wvr=6&is_all=1 GitHub:github.com/saint-000 知乎:https:/...

一个会写代码的烤鸭 5801

类的静态成员

关于类的静态成员,我们需要知道以下几点: 类里面static修饰的成员,成为静态类成员。 类的静态成员是该类型的所有对象对象所共享。 (1)类的静态成员是属于类而不属于对象,所以他不是类的单个对象所有。(2)静态成员只存在一个,不像普通的成员,每创建一个对象,就会创建一组普通的成员。(3)静态成员变量的初始化不能在类中,肯定是不能在构造函数中,只能在类外并且在main函数之前,按照这样的格式进行初始化:变量类型 类名::变量名= 值。并且是先初始化再使用。(4)在静态成员函数中不可以使用非静态成员。因为非

modi000的博客 4777

AI计算,为什么要用GPU?

几年后,2012年,神经网络之父杰弗里·辛顿(Geoffrey Hinton)的两个学生——亚历克斯·克里切夫斯基(Alex Krizhevsky)、伊利亚·苏茨克沃(Ilya Sutskever),利用“深度学习+GPU”的方案,提出了深度神经网络AlexNet,将识别成功率从74%提升到85%,一举赢得Image Net挑战赛的冠军。根据形态,GPU可分为独立GPU(dGPU,discrete/dedicated GPU)和集成GPU(iGPU,integrated GPU),也就是常说的独显、集显。

经营范围: CTA、SRRC、CCC、移动、电信、联通入库 1674

C++ | 说说类中的static成员

说一说类中的静态成员变量和静态成员函数,附带一些static做修饰的注意事项

做技术人 · 产优质博客 · 找好工作 2702

AC360变频器使用案例

AC360变频器使用案例!

QING_BOSS的博客 517

【Docker】Docker安装Hadoop分布式集群

hadoop目录安装在:/usr/local/hadoop-2.7.0/etc/hadoop。访问Hadoop102:9870,查看是否能够看到hdfs界面。访问hadoop103:8088,查看能够看到yarn界面。在yarn上可以看到执行情况。

weixin_46429290的博客 3459

【C++入门】静态成员详解(定义、实现原理、使用注意事项)

(1)在类中用static修饰成员,则该成员是静态成员;(2)静态成员是属于类本身的,所有类的对象共享;(3)类的对象都可以访问静态成员,但是所有类的成员访问的静态成员都是同一份静态成员;(4)静态成员在类内部声明时加static声明,在类外定义静态成员时无需添加static修饰;

weixin_42031299的博客 6324

【Linux】U盘配置Ubuntu系统 ——(Win10+Ubuntu20.04)双系统安装教程

Ubuntu系统安装

WS_Change的博客 4327

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

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

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

Unity Shader学习笔记/Urp/水墨风效果

Unity Shader学习

qq_63133691的博客 2116

C#与欧姆龙PLC 通信——Fins Tcp协议

该调试助手专门为了帮助大家学习以及测试Fins-Tcp通信,下面进行详细介绍。

qq_34059233的博客 2080

C++ 类的静态成员详解【static】

C++ 类的静态成员详解【static】 本文记录C++中static修饰类成员成为静态成员,其中包括静态成员类别、作用和程序演示。 C++中 static 关键字意为静态,用于修饰类中的成员(包括成员变量和函数)。 用static修饰成员变量,即为静态成员变量;用static修饰成员方法,即为静态成员方法。 成员属于class本身,而不属于对象

Gary_ghw的博客 1万+

OpenClaw实战系列07:定时任务与自动化工作流实战——让AI从“被动响应”到“主动执行”

通过本文的学习,你已经将 OpenClaw 从“被动应答”升级为“主动执行”的自动化引擎。定时简报:每天8点自动生成行业简报推送飞书/钉钉GitHub事件触发:PR合并自动触发Code ReviewAgent间协作:数据采集→分析→报告全自动流水线系统监控:定时检查服务器状态,异常自动告警核心收获掌握 OpenClaw 内置 Cron 系统的三种调度模式学会 Webhook 配置和事件触发机制理解 Agent 间通信的两种方式(sessions_spawn / sessions_send)

PeterPan的博客 691

类的静态成员与静态成员函数

声明静态成员 使用类的静态成员 定义静态成员 静态成员的类内初始化 静态成员能用于某些场景,而普通函数不能

双鱼座boyy的博客 4525

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

类的静态成员的定义、调用及继承详解【C++每日一学】

C++静态成员详解:类共享变量与函数 本文深入解析C++中静态成员的关键特性与应用场景。静态成员属于类本身而非对象实例,主要包括静态数据成员和静态成员函数两种形式。 核心要点 静态数据成员:所有对象共享同一份拷贝,生命周期与程序相同。声明与定义分离,C++17引入inline static简化定义。 静态成员函数:无this指针,只能访问静态成员。推荐使用ClassName::static_member()方式调用。 继承特性:派生类共享基类静态成员而非继承,同名静态成员会隐藏基类版本。 应用场景 全局计数

不会C++、害怕嵌入式且不爱看动漫的小趴菜 2万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++ 类 静态成员

和其他成员函数一样,静态成员函数即可以在类的内部定义,也可以在类的外部定义。在类的外部定义时,不能重复static关键字,static关键字只出现在类的内部。因为静态数据成员不属于类的任何一个对象,所以并不是在创建类的对象时被定义的,也就是说它不是在构造函数中被初始化的。一般来说,不能在类的内部初始化静态成员,必须在类的外部定义和初始化每个静态数据成员。在类的外部定义静态数据成员的方法和在类外部定义成员函数差不多,需要指定成员类型名,然后时类名、作用域运算符以及成员数据自己的名字。

xiaozhu_daidai的博客 1751

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++-类-静态成员1:静态成员变量、静态成员函数、const静态成员属性

在类定义中,它的成员(包括成员变量和成员函数),这些成员可以用关键字static声明为静态的,称为静态成员。不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的对象共享。

u013250861的博客 1023

C++类中的静态成员

静态成员变量、静态成员函数

gemluoye的博客 1108

C++类静态成员与类静态成员函数详解

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员 也会发生变化。为了避免混乱,所以不可在类体内进行赋值 当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有 类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关。静态方法就是与该类相关的,

erzr_zhang的博客 822

C++--类的静态成员

类的静态成员static

学无止境 2108

C++:类的静态成员详解

我们既可以在类的内部也可以在类的外部定义静态成员函数。当在类的外部定义静态成员时,不能重复static关键字,该关键字只出现在类内部的声明语句。细节静态数据成员不属于类的任何一个对象,所以它们并不是在创建类的对象时被定义的。这意味着它们不是由类的构造函数初始化的。而且一般来说,我们不能在类的内部初始化静态成员。所以,必须在类的外部定义和初始化每个静态成员。一个静态成员只能被定义一次。静态数据成员定义在任何函数之外,因此一旦它被定义,就被一直存在于程序的整个生命周期中。func1();...

HS_Jack_ZZZ的博客 814

c++类的静态成员

静态成员 由关键字static修饰说明的类成员,成为静态类成员(static class member)。虽然使用static修饰说明,但与函数中的静态变量有明显差异。类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公用内存中。类的静态成员分为静态成员变量和静态成员函数。 1 静态成员变量 在类定义中,用关键字static修饰的数据成员为静态数据成员。 该类产生的所有对象共享系统为静态成员分配的一个存储空间,而这个存储空间是在编译时分配的,在定义对象时不再为静态成员分配空间,即静态成员的大

Anurmy的博客 1019

类的静态成员函数和静态成员变量的使用

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

clc4210408的专栏 5万+

C++类的静态成员详解

类的静态成员分为静态数据成员和静态成员函数   静态数据成员   假如我们要设计一个战争游戏,游戏中有许多的兵种。游戏的过程中,每隔一段时间每个兵种都会产生,同时由于战争的消耗,每个兵种士兵的数量又会减少。为了情节更逼真呐,我们引入了一个士气的概念,当士气比较高的时候,这个兵种的士气战斗力就会很强,士气较低的时候,兵种的战斗力就会比较弱。兵种的士气受很多因素影响,其中一个最直接的因素就是士兵的数量相关,它与数量成正比。我们就需要一组全局变量,每个变量都会记录当前兵种的数量,但是使用全局变量会引入很多的问

jusu10的博客 1408

C++ 类中的静态成员

为什么要有类的静态成员? 我们学习一个知识点,首先想到的是为什么要有这个东西的存在呢?对于C++ 类的静态成员存在的理由如下: 有的时候类需要它的一些成员与类本身无关,而不是与类的各个对象保持关联。 例如:一个银行账户类型类可能需要一个数据成员来表示当前基准利率。在此例中,我们希望利率与类关联,而非与类的每个对象关联。从实现的效率的角度来看,没必要每个对象都存储利率信息。而且更加重要的是,一旦利...

Lee's site 1731
上一篇: Callable 可调用对象 lambda表达式 “匿名函数“
下一篇: 关于模板类的友元函数的运算符重载的问题
思路可以啊
博客等级 码龄6年 91粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值