注:普通成员又名非静态成员。静态(static)成员。类成员包括数据成员和成员函数。
两者区别
1分配内存的时间不同
静态成员属于类本身,不属于具体类对象,在类加载时分配内存空间,程序结束时才消失。可以类名直接访问。
普通成员属于类对象,在类对象创建时(类的实例)才会分配内存,即动态加载内存,不用时消失。通过类对象去访问。
注:静态成员不能去访问普通成员,因为静态成员存在于普通成员之前,我们不能去访问一个内存中不存在的东西。
2是否传递this指针
普通成员函数传递this指针。实质是一个包含指向具体对象的this指针的函数,即其隐式包含一个指向当前对象的this指针。
静态成员函数不传递this指针。
注:也就是说静态成员函数不接受隐含的this指针,无法直接访问类中的非静态成员。
3成员函数间访问
普通成员可以访问静态成员;
静态成员函数只能通过对象间接引用非静态成员。
代码如下:
#include<iostream>
using namespace std;
class A{
public:
void generalFun(){//实质void generalFun(A*this)
cout<<"this is general fun"<<endl;
}
static void staticFun(A a){
a.generalFun();//实质generalFun(&a)
cout<<"this is static fun"<<endl;
}
private:
int a;
static int b;
};
int A::b=1;//静态数据成员是静态存储,必须初始化。1在类体外初始化;2使用作用域运算符表明它所属的类。
int main(){
A a;
A::staticFun(a);
return 0;
}
//运行结果如下:
this is general fun
this is static fun
注:
1静态数据成员初始化格式如下:
<数据类型> <类名>::<静态数据成员名>=<值>
引用格式:
<类名>::<静态成员名(成员数据/成员函数)>
2静态成员变量性质:
1只能被初始化一次,下次执行该语句时自动跳过。
2属于类,而非具体对象
3静态成员函数性质:
1不包含指向具体对象的this指针;
2不可以直接调用普通成员。
3类加载时分配内存空间属于类而非具体对象。