class中的静态成员函数作用再整个类的内部,对应类的所有实例是共享静态成员函数的,在调用静态成员函数的时候跟调用非静态成员函数是有区别的。另外,静态成员函数只能访问对应类内部的静态数据成员,否则会出现编译错误,下面举个例子来描述下。
class box{
private:
int _non_static;
static int _static;
public:
int a(){
return _non_static;
}
static int b(){
//_non_static=0; 错误
//静态成员函数不能访问非静态成员变量
return _static;
}
static int f(){
//a(); (不对,静态成员函数不能访问非静态成员函数)
return b();
}
};
int box::_static= 0;//static 静态成员变量可以在类的外部修改
int main(){
box box1;
box* pointer=&box1;
box1.a();
pointer->a();
box::b();//类名::静态成员函数名
return 0;
}
另外,对于非静态成员变量,需要用到类的对象来进行调用,这里就涉及到this指针的概念:
静态成员函数由于没有传递this 指针,所以静态成员函数只能访问static 成员,而不能访问非static 成员。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。换句话说,你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。例如,调用box.SetBoxState(9) <===> SetBoxState(&box, 9),this帮助完成了这一转换 。在成员函数的内部,我们可以直接使用调用该函数的对象的成员,而无需通过成员访问运算符来做到这一点,因为this所指的正是这个对象。任何对类成员的直接访问都被看成this的隐式使用。this的目的总是指向这个对象,所以this是一个常量指针,C++中不允许改变this中保存的地址。
当然类的static函数在类内声明、类外定义时,类内要写明static 类外则不能加static关键字,否则也会出现编译错误,比如:
class box{
public:
static int f();
};
/*错误的写法
static int box::f(){
return 0;
}
*/
//正确的定义
int box::f(){
return 0;
}
int main(){
return 0;
}