static的使用
一、用于静态生存期变量
1、什么是静态生存期变量
如果对象生存期与程序的运行周期一样,则它具有静态生存期,如果在函数内部局部作用域中声明具有静态生存期的对象,就需要用到static关键字,该变量就是静态生存期变量。列如:
i便是具有静态生存期的变量,即为静态变量。
2、局部作用域中静态变量的特点如下:
它不会随每次调用函数都产生一个新的副本,当在定义该变量的同时为他赋初值,它就会被初始化,且该函数被执行完后,下次再调用时,该变量的值会保持上一次的值继续使用,若未被初始化时,该变量会被赋予0值初值。但是对于动态生存期变量,不指定初值意味着初值不确定。 |
下面将通过段代码实现静态变量与具有动态生存期的变量之间的区###运行结果如下
![](https://img2018.cnblogs.com/blog/1784959/201909/1784959-20190928160941645-1580724200.png)
![](https://img2018.cnblogs.com/blog/1784959/201909/1784959-20190928161658699-1276478640.png)
由运行结果显示上列两个函数中虽然都具有相同的变量,但是却不相互影响,并且具有静态生存期的变量只初始化一次,重复多次使用时,会继续上次的值接着使用 |
二、用于类的静态成员、静态函数成员
1、什么是静态数据成员
一个类的所有对象具有相同的属性,如果某个属性为整个类所共有,不属于任何一个具体对象,则采用static关键字来声明为静态成员。
2、静态成员在每个类只有一个副本,由该类的所有对象共同维护和使用,从而实现同一类的不同对象之间的数据共享。
注意:在类中声明静态数据成员是需定义在私有成员中,并且初始化需定义在类外,它们是配套使用的。 | |
列如
、、、
class Point
{
private:
static int count; //静态数据成员的声明
};
int Point::count=0; //静态数据成员的初始化
、、、
当想要输出类中静态数据成员时,如果想在声明对象之前,由类中的函数输出这个静态数据的初始化时,若通过类名调用这个函数,那么编译器会报出如下错误。
![](https://img2018.cnblogs.com/blog/1784959/201909/1784959-20190928161014761-1453249482.png)
这时就需要用static定义一个静态函数成员。它的优点就是在类中除了通过对象调用函数外,还可以通过类名调用,而非静态成员函数只能通过对象调用。
以下代码时具有静态数据成员和函数成员的Point类
![](https://img2018.cnblogs.com/blog/1784959/201909/1784959-20190928161031537-2063417007.png)
运行结果
![](https://img2018.cnblogs.com/blog/1784959/201909/1784959-20190928161124184-504613145.png)