静态成员static能被继承吗
static修饰的变量在类定义中,它的成员(包括数据成员和成员函数)可以⽤关键字static声明为静态的,这些成员称为静态成员
静态成员的特性:
• 不管这个类创建了多少个对象,静态成员只有⼀个拷贝,这个拷贝被所有属于这个类的
对象共享
静态成员包括:
• 静态数据成员
• 静态成员函数
在⼀个类中,若将⼀个数据成员声明为 static,这种成员称为静态数据成员。
(静态数据成员在类内声明,在类外定义)
与⼀般的数据成员不同,⽆论建⽴了多少个对象,都只有⼀个静态数据的拷贝
可以认为该静态数据是属于该类的,⽽不是具体的属于某⼀个对象
说明:
• 静态数据成员属于类(准确地说,是属于类中⼀个对象集合),⽽不像普通数据成员那样属于某⼀对象,
因此可以使⽤“类名::”访问静态的数据成员。但也可以通过“对象名.”访问
• 静态数据成员不能在类中进⾏初始化,因为在类中不给它分配内存空间,必须在类外的其它地⽅为它提供定义。⼀般在main() 开始之前、类的声明之后的特殊地带为它提供定义和初始化。缺省时,静态成员初始为0
静态成员函数可以在类内定义。也可以在类内声明,类外定义。在类外定义时,不要⽤ static前缀
• 编译系统将静态成员函数限定为内部连接,也就是说,与现⾏⽂件相连接的其它⽂件中的同名函数不会与该函数发⽣冲突,维护了该函数使⽤的安全性,这是使⽤静态成员函数的⼀个原因
• 使⽤静态成员函数的另⼀个原因是,可以⽤它在建⽴任何对象之前处理静态数据成员,这是普通成员函数不能实现的功能
在⼀般的成员函数中都隐含有⼀个this指针,⽤来指向对象⾃⾝,⽽在静态成员函数中没有this指针,因为它不与特定的对象相联系,调⽤时使⽤:
类名::静态成员函数名() 如:SmallCat::totalDisp(),当然使⽤:
对象.静态成员函数名() 也是正确的。如:w1.totalDisp()
• ⼀般⽽⾔,静态成员函数不能访问类中的⾮静态成员
继承
基类和其派⽣类共享该基类的静态成员变量内存!
1.  ⽗类的static变量和函数在派⽣类中依然可⽤,但是受访问性控制(⽐如,⽗类的private域中的就不可访问),⽽且对static变量来说,派⽣类和⽗类中的static变量是共⽤空间的,这点在利⽤static变量进⾏引⽤计数的时候要特别注意。
2.  static函数没有“虚函数”⼀说。因为static函数实际上是“加上了访问控制的全局函数”,全局函数哪来的什么虚函数?
3.  派⽣类的friend函数可以访问派⽣类本⾝的⼀切变量,包括从⽗类继承下来的protected域中的变量。但是对⽗类来说,他并不是friend 的。
#include <iostream>
using namespace std;
class Base
{
public:
static int a;
static void Fun( )
{
cout<<"Base fun()!"<<endl;
}
};
int Base::a=1000;
class Derived:public Base
{
public:
static void Fun()
{
cout<<"Derived fun()!"<<endl;
}
};
int main(void)
{
cout<<Derived::a<<endl;
Derived d;
d.Fun();
Base b = (Base) d;
b.Fun();
return 0;
}
1000
Derived fun()!
Base fun()!
测试代码会发现Base、Derived类中的 a 值相等,然后查看地址发现地址也相等。所以⽗类⼦类指向是同⼀个全局数据区的static变量。如果定义 int Derived::a=200; 会出现编译错误。
不能被继承。
⼦类可以访问⽗类的static变量,但受访问控制(若⽗类中的static是private就⽆法访问)
⼦类和⽗类的static变量是同⼀变量,共享同⼀存储空间。
⽽继承关系,⼦类和⽗类是分别有⾃⼰的存储空间的。
#include<iostream>
using namespace std;
int cnt=1;
void f(){
static int test = cnt;
cout<<test<<endl;
cnt++;
}
int main(){
f();
f();
f();
cout<<cnt<<endl;
return 0;
}
1
1
1
4
但是C++规定,局部static变量只会初始化⼀次!所以第⼀个程序中后⾯调⽤两次f()都不会初始化test。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。