本文主要是将零碎的点整理起来方便于复习学习
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

基类所定义的静态成员,也将被派生类共享。