本文主要是将零碎的点整理起来方便于复习学习
static可用来定义一个静态变量。静态变量是在全局区分配内存,故它的内存不会因函数的退出而被释放。static不能同virtual,const关键字同时使用。
定义一个静态全局变量
定义静态全局变量时没手动初始化时,会自动帮我们初始化为0。静态全局变量只能在本文件中被调用,不能在其它文件调用
static int a = 0;//定义一个静态全局变量
int main()
{
}
若定义的是一个静态函数,则和其他函数的区别是,该函数不能在其它文件被调用。
定义一个静态局部变量
静态局部变量和静态全局变量一样,没手动初始化它时,会自动初始化为0,且静态局部变量的只初始化一次。静态局部变量是存储在全局区里的,它的作用域虽然和自动变量一样,在定义它的函数中有效,脱离这个函数时无效。但脱离这个函数时,这个静态局部变量依旧存在,只是不能用了而已。
int main()
{
static int a = 1;//定义一个静态局部变量
}
在类中定义一个静态成员变量
静态成员提供了一个同类对象的共享机制,这个类无论有多少个对象被创建,这些对象共享这个 static 成员,即静态成员变量只分配一次内存,供所有对象共用。静态成员变量必须先初始化后再使用,初始化应该在类的外部初始化。
class A
{
public
A()
{
a++;//每次A被构造,a就+1
}
void yy()
{
cout << a << endl;
}
private:
static int a;
};
int A::a = 0;//在类的外部初始化
int main()
{
A q;
A w;
q.yy();//输出的结果应该是2,因q和w共享静态成员变量a,两次构造函数的调用让a=2
}
定义一个静态成员函数
静态成员函数没有this指针,不能调用类中的非静态成员变量,也不能调用类中的非静态成员函数。静态成员间可以相互访问,而非静态成员可以任意的访问静态成员。静态成员函数的实现即可以在类里面进行,也可以在类之外进行。
class B
{
private
static int a;
int b = 0;
public
static void yy();
};
int B::a = 0;
void B::yy()
{
b = 1;//编译错误,因为静态成员函数不能调用非静态成员变量
a = 1;//正确
}
int main()
{
B b;
b.yy();//通过对象来调用静态成员函数
B::yy();//直接调用静态成员函数,注意,非静态成员函数不能用这种方法调用
}```
派生类中的static
基类所定义的静态成员,也将被派生类共享。