静态成员函数的特性类似于静态成员的使用,同样与对象无关,调用方法为类名称加域区分符加成员函数名称,在上面的代码中就是Internet::Sc();,静态成员函数由于与对象无关系,所以在其中是不能对类的普通成员进行直接操作的。
如果上面的 static void Internet::Sc()修改成为:
static void Internet::Sc()//静态成员函数 { cout<<name<<endl;//错误 cout<<count<<endl; }
静态成员函数与普通成员函数的差别就在于缺少this指针,没有这个this指针自然也就无从知道name是哪一个对象的成员了。
根据类静态成员的特性我们可以简单归纳出几点,静态成员的使用范围:
1.用来保存对象的个数。
2.作为一个标记,标记一些动作是否发生,比如:文件的打开状态,打印机的使用状态,等等。
3.存储链表的第一个或者最后一个成员的内存地址。
为了做一些必要的练习,深入的掌握静态对象的存在的意义,我们以前面的结构体的教程为基础,用类的方式描述一个线性链表,用于存储若干学生的姓名,代码如下:
#include <iostream> using namespace std; class Student { public: Student (char *name); ~Student(); public: char name[30]; Student *next; static Student *point; }; Student::Student (char *name) { strcpy(Student::name,name); this->next=point; point=this; } Student::~Student ()//析构过程就是节点的脱离过程 { cout<<"析构:"<<name<<endl; if(point==this) { point=this->next; cin.get(); return; } for(Student *ps=point;ps;ps=ps->next) { if(ps->next==this) { cout<<ps->next<<"|"<<this->next<<endl; ps->next=next;//=next也可以写成this->next; cin.get(); return; } } cin.get(); } Student* Student::point=NULL; void main() { Student *c = new Student("marry"); Student a("colin"); Student b("jamesji"); delete c; Student *fp=Student::point; while(fp!=NULL) { cout<<fp->name<<endl; fp=fp->next; } cin.get(); }
从上面的代码来看,原来单纯结构化编程需要的一个链表进入全局指针在这里被类的静态成员指针所替代(类的静态成员完全可以替代全局变量),这个例子的理解重点主要是要注意观察类成员的析构顺序,通过对析构顺序的理解,使用析构函数来进行节点的脱链操作。
|