目前为止,提到的所有的类内成员都是与对象相关的,就是类中的成员被每个对象分别持有,对象的地址通过this指针来区分
但是,类中的有一种成员不是与对象相关联,而是与类的整体相关联,这种成员就是static成员
因为static成员函数不为类的对象所有,所以,static成员函数没有this指针,所以,不能将static成员函数声明为const,也不能在static成员函数中调用非static成员变量,更不能在static成员函数中使用this指针
class staticwithclass
{
public:
staticwithclass(){}
~staticwithclass(){}
int i;
static void func() const;
};
不能将static成员函数声明为const,因为const将this指针指向的对象变为const,而static成员函数无this指针
class staticwithclass
{
public:
staticwithclass(){}
~staticwithclass(){}
int i;
static void func();
};
void staticwithclass::func()
{
i=10;
}
不能在static成员函数中调用非static成员变量,static关键字在成员函数声明时添加就可以,在成员函数定义时不能重复添加
void staticwithclass::func()
{
this->i=10;
}
不能在static成员函数中使用this指针
虽然static成员不属于类的对象,但是依然可以用类的对象,指针和引用来访问静态成员
class staticwithclass
{
public:
staticwithclass(){}
~staticwithclass(){}
int i;
//static int a;
static void func();
};
void staticwithclass::func()
{
cout<<__func__<<endl;
}
int main(int argc, char const *argv[])
{
staticwithclass::func();
staticwithclass t;
t.func();
staticwithclass *p=new staticwithclass;
p->func();
staticwithclass &r=t;
r.func();
return 0;
}
因为static成员变量不属于任何对象,所以在类的对象创建的时候,无法初始化static成员,所以静态成员变量一般情况下放在类的外边定义并初始化
class staticwithclass
{
public:
staticwithclass(){}
~staticwithclass(){}
int i;
static int a;
static void func();
};
int staticwithclass::a=10;
void staticwithclass::func()
{
cout<<__func__<<endl;
a=100;
cout<<a<<endl;
}
int main(int argc, char const *argv[])
{
staticwithclass::func();
return 0;
}
如果想在类内初始化static成员变量,那么必须用const修饰该变量
class staticwithclass
{
public:
staticwithclass(){}
~staticwithclass(){}
int i;
static const int a=10;
static void func();
};
void staticwithclass::func()
{
cout<<__func__<<endl;
cout<<a<<endl;
}
int main(int argc, char const *argv[])
{
staticwithclass::func();
return 0;
}
如果不加const 会报错
此外static成员的类型可以是类的类型,而非static成员只能使用类的指针,详细见C++知识点13——友元,类的声明
class staticwithclass
{
public:
staticwithclass(){}
~staticwithclass(){}
static staticwithclass t; //如果将static去掉,则不能编译通过
};
参考:
《C++ Primer》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出