1、static成员函数不能访问非static成员函数/成员,只能static成员间相互访问:
//.h
class A
{
public:
static func1() // 编译出错
{
menber1 = 1;
}
static func3()
{
cout<<"abc"<<endl;
}
static func2()
{
menber2 = 1;
func3();
}
private:
int member1;
static int member2;
};
//.cpp
int A::member2 = 0; //静态成员类外初始化,因为其属于类,不属于类对象
static func1()编译出错 // 因为static成员函数调用了非static成员变量
A::func2(); // 调用成功,因为只是static成员间相互调用
注:由于没有this指针的额外开销,因此静态成员函数比类对象的成员函数调用速度快。
原因: 根本上有this指针导致
a) 静态成员属于类而不是属于类对象,因此静态成员没有this指针;而非静态成员属于对象,因此非静态成员拥有this指针,指向所属对象。
b) 调用静态成员函数时,并不知道其中的 non-static member
从哪来,属于哪个对象,甚至可能都不存在。因此静态成员函数无法访问自己类的非静态成员。
2、static成员函数通过访问类对象间接访问非static成员函数/成员:
class A
{
public:
static func1(A* _a)
{
_a-> menber = 1;
cout<<_a-> menber<<endl;
}
private:
int menber;
};
通过传入类成员指针,利用该指针来访问类对象的非静态成员。(实际上是传入了一个this
,弥补static成员函数没有this的缺陷)
3、非static成员函数可访问static态成员函数/成员:
//.h
class A
{
public:
static func3()
{
cout<<"abc"<<endl;
}
func1()
{
menber2 = 1;
func3();
}
private:
static int member2;
};
//.cpp
int A::member2 = 0; //静态成员类外初始化,因为其属于类,不属于类对象
A a;
a.func1(); // 调用成功,非static成员函数可访问static态成员函数
a.func3(); // 调用成功,类成员直接访问static态成员函数
原因:
a) 非static成员函数拥有对类成员的访问权限,因此可以访问。
与该文类似,都是由于this指针引发的问题:
const对象只能调用const成员函数、不能调用非const成员函数;非const对象可以调用const成员函数;
建议学习此篇文章:浅析C++中的this指针(PS:我也还没看)
参考资料:
1、C++中静态成员函数访问非静态成员变量
2、C++中static成员函数访问非static成员变量
3、class 的static成员变量和 static 成员函数
总结:
1、非static成员函数可访问static态成员函数/成员;
2、static成员函数不能访问非static成员函数/成员,只能访问static成员函数/变量。