静态成员函数(面向对象的static关键字)

静态成员函数

  与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。普通的成员函数一般都隐含一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this都是缺省的。如函数fn()实际是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。下面举个静态成员函数的例子。

 1 #include<iostream>
 2 using namespace std;
 3  
 4 class MyClass
 5 {
 6  private:
 7       int a, b, c;
 8       static int sum;//声明静态数据成员
 9 public:
10       MyClass(int a, int b, int c);
11       static void GetSum();//声明静态成员函数    
12 };
13 
14 int MyClass::sum = 0;//定义并初始化静态数据成员
15 MyClass::MyClass(int a, int b, int c)
16 {
17      this->a = a;
18      this->b = b;
19      this->c = c;
20      sum += a+b+c;//非静态成员函数可以访问静态数据成员
21 }
22 
23 void MyClass::GetSum()//静态成员函数的实现
24 {
25       //cout<<a<<endl;//错误代码,a是非静态数据成员
26       cout<<"sum = "<<sum<<endl;
27 }
28 
29 int main()
30 {
31       MyClass M(1, 2, 3);
32       M.GetSum();
33       MyClass N(4, 5, 6);
34       N.GetSum();
35       MyClass::GetSum();
36 
37       return 0;
38 }

关于静态成员函数,可以总结为以下几点:

  ·出现在类体外的函数定义不能指定关键字static;

  ·静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;

  ·非静态成员函数可以任意地访问静态成员函数和静态数据成员;

  ·静态成员函数不能访问非静态成员函数和非静态数据成员;

  ·由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;

  ·调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:

  <类名>::<静态成员函数名>(<参数表>)

  调用类的静态成员函数。

原文地址:https://www.cnblogs.com/QoQian/p/4898253.html