1、存在于全局和局部的作用域中的静态变量
1、被static修饰的全局变量,只能在本文件中使用,在其他文件不能使用。
2、被static修饰的局部变量,只能在函数体中被调用,多次调用该函数时,也只能被初始化1次。
#include <iostream>
using namespace std;
static int i = 0; //静态全局变量
void display()
{
static int j = 0;//静态局部变量
j++;
cout << "i = " << i << endl;
}
int main(void)
{
i++;
display(); //i=1;
display(); //j = 1;
display(); //j = 2;
return 0;
}
2、存在于类里面的静态数据成员
和在函数里面的静态变量一样,创建的对象被销毁后还是存在内存中的
#include <iostream>
using namespace std;
class A
{
public:
A(int a)
{
i = a;
}
private:
static int i; //在类中的静态数据成员
};
int A::i = 10; //要在类外进行定义,不属于某个对象,而是被所有对象共享
int main(void)
{
A a(2);
return 0;
}
3、存在于类的成员函数里面
和在普通函数作用域一样,效果也差不多
#include <iostream>
using namespace std;
class A
{
public:
void display()
{
static int i = 0;
i++;
cout << i << endl;
}
private:
static int i; //在类中的静态数据成员
};
int main(void)
{
A a;
a.display();//i=1;
a.display();//i=2;
a.display();//i=3;
return 0;
}
4、存在于全局作用域的静态函数
只能在本编译单元(当前文件)中被调用,不能被其他文件调用,不能被extern修饰
#include <iostream>
using namespace std;
static void display()
{
cout << "This is a static global func" << endl;
}
int main(void)
{
display();
display();
display();
return 0;
}
5、存在于类的静态成员函数中的静态数据成员
(1)静态数据成员必须单独初始化,否则报链接错误
(2)静态成员函数不能不能调用类中的非静态成员函数和非静态数据成员
(3)静态数据只有一份,且不依赖对象而存在
#include <iostream>
using namespace std;
class A
{
public:
static void display(); //声明静态函数
private:
static int a;
int b;
};
int A::a; //这里要对静态数据成员进行定义
void A::display()
{
cout << a << endl;
//cout << b << endl; 类中的静态函数不能调用非静态成员函数和数据成员
}
int main(void)
{
A a;
a.display();
return 0;
}