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成员函数/变量。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐