C++静态成员

 本篇将静态成员详细论述一下,让我们彻底了解这个属于类却不属于对象实例的东西到底是什么样的。

 

静态成员,它们是属于类的,包括:
静态成员变量、
静态成员函数。
它们只存在于类中,是属于类的,在对象实例内存区是看不到它们的。

为什么会这样呢?
因为,对于静态成员变量来说,真正的分配内存区,定义并初始化它,类似定义全局变量,只不过在变量前要指明它所属的类。
其实它就是一个全局变量,只不过被限定在类里使用。为了说明这点我们可以用 sizeof() 来得到类定义的大小,不管你在类中定义多少个静态成员变量,sizeof() 获得的大小不变,这就说明,类对象实例内存区根本就没有这个静态成员变量。所以静态成员变量只属于类,是在类中存在的,这也就说明我们可以用类名和类限定符来操作该静态成员变量,即使该类没有实例。

 

那么,静态成员函数呢?一样的。
它和其它成员函数的区别就是没有 this 指针。this 指针是指向类对象实例的,对象实例中包含了指向虚函数表的指针,对象实例通过虚函数表来实现多态。可见,静态成员函数因为没有 this 指针,根本就找不到对象实例,也就无法调用虚函数了。
那么,对于类中的一般成员函数,静态成员函数能调用它们吗?
也是不可以的。因为,编译器对所有非静态成员函数,包括一般成员函数和虚函数都要在形式参数里多加一个 this 指针参数。显然,对于静态成员函数来说,编译器根本不会给它传一个 this 指针参数,它拿什么当 this 指针传给其它函数呢,所以它也就没法调用需要 this 指针的成员函数了。
它只能调用和自己一样的静态成员函数,它们都没有 this 指针,可以相互调用。

 

静态成员函数没有 this 指针,参数表在编译时没有改变,它们是原原本本的原型,因此,这个特性,在 win32 程序设计中可以作为 callback 函数使用,即回调函数。哈哈,静态成员属于类,有没有类实例一样用,就像 C 函数一般。


用类名或者对象实例来访问静态成员,只能访问类中 public 属性部分的。它仍然受属性保护影响。

声明在类 private 部分的静态成员变量,初始化它是可以的,这算是初始化定义(上面所讲的像全局变量那样定义),分配内存,这并不算是赋值操作。赋值操作要受类属性保护影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值