static作用范围(变量、函数)
1.函数体内:static变量作用于函数体内,其值在下次调用时维持上次的值保持不变。
int func(){
static int a=3;
//int a=3;
cout<<"a="<<a<<endl;
return a--;
}
int main()
{
for(int count=0;count<10;count++){
int b=func();
cout<<"b="<<b<<endl;
}
return 0;
}
当func函数中a定义为static int 类型时,输出结果为
a=3
b=3
a=2// a维持上一次返回的值(3-1=2)保持不变
b=2
a=1
b=1
当func函数中a定义为int 类型时,输出结果为
a=3
b=3
a=3//每次a都为3
b=3
a=3
b=3
2.模块内(只能模块内访问和调用):
模块内的static**全局变量**只能被模块内的所有函数访问,不能被模块外的函数访问。
模块内的static**函数**只能被模块内函数调用,函数使用范围限制在声明的模块内。
3.类内
类中static**成员变量**属于整个类拥有,对类的所有对象只一份复制,该类型的所有对象共同访问。(静态数据成员只有一份拷贝; 非静态数据成员每个对象有一份拷贝)
初始化静态成员变量 <类型> <类名>::<静态成员变量名>=<值>
类中static成员函数属于整个类拥有,函数不接收this指针,不能访问非静态成员函数和非静态成员变量,只能访问类中的static成员函数和变量。
调用static成员函数 <类名>::<静态成员函数名>
class M{
public:
M(int a,int b,int c);
void getsum();
private:
int a,b,c;
static int sum;//声明静态数据成员
};
int M::sum=0;//定义并初始化静态数据成员
M::M(int a,int b,int c){
this->a=a;
this->b=b;
this->c=c;
sum+=a+b+c;
}
void M::getsum(){
cout<<sum<<endl;
}
int main()
{
M test(1,2,3);
test.getsum();
return 0;
}
“`
class M{
public:
M(int a,int b,int c);
static void getsum();
private:
int a,b,c;
static int sum;
};
int M::sum=0;//
M::M(int a,int b,int c){
this->a=a;
this->b=b;
this->c=c;
}
void M::getsum(){
sum+=this->a+this->b+this->c;//当getsum声明为静态成员函数时,不能使用当前对象指针this访问非静态成员变量,只能访问静态成员变量。所以编译出错
cout<