普通成员方法和静态成员方法的区别

我们在了解普通成员方法和静态成员方法之前,先了解一下静态变量。

静态变量
在我们函数栈上定义一个普通变量之后,它的生存周期就是随着函数执行完,栈帧的回退释放掉。优点是封装了数据变量。
全局变量的生存周期是该程序开始执行到该程序结束,作用域是全局下的,全局的函数都可以访问。(这样会引发很多问题因为这个不安全,没有很好的封装)。
我们现在想要一个函数定义一个变量之后,该变量在函数执行完后,仍然值不变,且具有隐藏性。这样的话全局变量和普通变量都不满足,就引出了我们静态变量。在一个函数里定义了一个静态变量,我们函数执行完下次继续执行时(这里是程序没结束),静态变量的值不变(且只初始化一次默认为0),其他函数无法直接访问该静态变量。这就是我们静态变量的功能, 值保持,隐藏。

讲了点C语言的内容。也算引出我们要讲的C++的静态数据成员和静态成员函数

静态数据成员
静态数据成员是该类所有,该类实例的对象所共有的,类只是数据的一个说明,不占内存,所以静态数据成员不在类中定义,是在类外定义的。也就是在程序一执行就被存放到了数据区了,所以它比对象先生成。

我这里先举两个例子

示例一:

我们如果要知道一个类共实例了多少个对象时候,是不是定义一个数据成员,放在所有的构造函数里,自加加。那么定义的这个数据成员如果是普通的数据成员,就会变成对象所私有的,也就失去了它的意义。因为当其他对象生成的时候,又会初始化另外一个相同名字的数据成员变量。
这里就是定义一个静态数据成员,这样这个静态数据成员就是为这个类服务的,当生成多个对象时候调用构造函数时,不会出现像普通数据成员一样又初始化一次的情况出现。那么就能统计出共生成了多少个对象。

示例二:
我们如果要抽象出一个连锁店的类,每个连锁店都有商品,抽象出一个商品类。连锁店的商品的价格是统一的。如果有一天要上调该商品的价格。我们要对每个实例出来的连锁店对象都进行修改,显然是很辛苦的。如果使用静态数据成员的话就没有这么麻烦。只要在定义出更改即可。而且也会节省内存,因为如果是普通数据成员的话,每个对象都要去初始化一个变量。

这里体现出来静态成员的减少修改代码的麻烦和节省内存的用处。


如何访问静态数据成员

<类对象名>.<静态数据成员名>    <类类型名>: :<静态数据成员名>
非静态成员就不可以使用   <类类型名>: :<静态数据成员名>

静态函数成员


这里静态函数成员也是为整个类服务的,所以使用上和静态数据成员是一样访问的。

普通函数成员
1)调用时候必须依赖一个对象
2)能访问私有和保护的成员
3)类作用域


静态函数成员

1)不需要依赖对象,可以说明下作用域即可访问
2)能访问静态函数成员和静态函数成员
3)类作用域

普通函数成员是_thiscall调用约定,静态函数成员调用时候是_cdecl调用约定。这就是他们访问对象成员时候受到限制的原因。 也是因为它不是_thiscall调用约定,所以它不是为单个对象服务的,服务于整个类的。或许这么理解有些牵强,反过来理解更好。设计者本身当初设计出来静态函数成员目的就是要服务整个类,所以它才是_cdecl调用约定。
静态数据成员和静态函数成员这点有区别
静态函数成员可以在类中和类外都可以定义
而数据是占用内存的,类只占一个字节内存(是为了解决使用到类时候有个地址方便寻址的),所以不能再类中定义。


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值