首页 > 代码库 > 静态成员
静态成员
静态成员变量的初始化一定要在类外,原因:
因为静态成员变量本身在main函数未开始时已经存在。不要让成员变量的初始化依赖于对象。不用对象,难到就不能用这一变量了吗?
如果将初始化放在类内。那么当不声明对象时,无法使用这一静态变量。编译器报错为‘undeclared identifier’。
#include<iostream>
using namespace std;
class B{
public:
static void Add(){i++;}
//静态成员函数只可以使用静态成员变量,因为静态成员函数没有this指针,所有对象共享使用这一
//成员函数所以无法使用非静态成员变量。因为每个非静态成员变量在各个对象中都不同。
static int i;//静态成员变量在类内声明:
void out(){cout<<"static i="<<i<<endl;}
};
int B::i=0;//静态成员变量一定要在类外初始化。
class D:private B{
public:
void f(){
i=5;
Add();
B::i++;//这里静态变量也可以直接用i++;
B::Add();
}
};
int main(){
B x;
D y;
x.Add();
x.out();
y.f();
cout<<"static i="<<B::i<<endl;//1.静态成员变量的调用可直接用 “类名::变量名”
cout<<"static i="<<x.i<<endl;//2.也可用用对象名直接调用。
//cout<<"D中i的值:"<<y.i<<endl;//这是错误的,因为在y中i的访问权限是私有的所有无法用对
//象访问。
return 0;
}
static 的作用:
一、static 在代码块内声明局部变量,作用域为代码块内。
其static的作用是声明为静态可持续变量,在程序中一直存在。
二、static 在代码块外声明局部变量时,作用域为声明处直到文件结尾。
其static的作用是声明为内部链接性,即不可以被程序的外部文件调用。起到隐藏作用
注意未加static的全局变量和函数可以被外部程序访问!
int j;//static duration,external linkage 可以被程序的外部文件使用。
static int k;//static duration ,internal linkage,作用在以下所有程序,且只可以本文件使
//用。
void test(){
static int i;//static duration nolinage;只作用于代码块内。静态局部变量
i=5;
cout<<"static i="<<i<<endl;
}
int main(){
//cout<<i<<endl;错误的
test();
cout<<j<<endl;//static和全局变量都是默认为0!
}
PS:全局变量和static修饰的变量都存储在静态存储区。
静态成员