静态成员函数(面向对象的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指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
·调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
<类名>::<静态成员函数名>(<参数表>)
调用类的静态成员函数。