static关键字与不同类型结合时,具有不同的含义。
静态变量
函数中的静态变量
当变量声明为static时,将在程序的生命周期内分配,多次调用该函数,静态变量的空间也只分配一次,传递上次调用变量的值,不会对变量计数进行初始化。
#include<iostream>
using namespace std;
void test()
{
static int x=0;
cout<<x<<" ";
x++;
}
int main()
{
for(int i=0;i<5;i++)
{
test();
}
return 0;
}
//输出0,1,2,3,4
类中的静态变量
声明为static的变量只初始化一次,对于不同的对象,不能有相同静态变量的多个副本,静态变量不能使用构造函数,类中静态变量应使用类外的类名和范围解析运算符显式初始化。
#include<iostream>`在这里插入代码片`
using namespace std;
class A{
public:
static int i;
A(){};
};
int A::i=1;
int main()
{
A obj;
cout<<obj;
}
静态成员
类对象为静态
对象在声明为static时也具有范围,直到程序的声明周期。
观察下面的两个代码,
#include<iostream>
using namespace std;
class Apple
{
int i;
public:
Apple()
{
i = 0;
cout << "Inside Constructor\n";
}
~Apple()
{
cout << "Inside Destructor\n";
}
};
int main()
{
int x = 0;
if (x==0)
{
Apple obj;
}
cout << "End of main\n";
if (x==0)
{
static Apple obj;
}
cout << "End of main\n";
}
输出结果为:
Constructor
Destructor
End of main
Constructor
End of main
Destructor
很明显的能看出差别,对象在if语句块声明为非静态,当创建对象,将调用构造函数,在出if语句块时,调用析构函数。而当对象声明为static,在面结束后调用析构函数。
类中的静态函数
静态成员函数与静态数据成员一样不依赖于类的对象,允许调用静态成员函数,但最好使用范围解析运算符调用静态成员。
静态成员函数仅能访问静态数据成员和其他静态成员函数,无法访问非静态数据成员和成员函数。