非static成员函数可访问static态成员函数/成员;static成员函数不能访问非static成员函数/成员,只能访问static成员函数/变量

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

  • 11
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值