对象指针->静态数据成员
【例3.16】 公有静态数据成员的访问 #include<iostream.h> class myclass{ public: static int i; int geti() { return i;} }; int myclass∷i=0; // 初始化,不必在前面加static main() { myclass∷i=200; myclass ob1,ob2; cout<<"ob1.i="<<ob1.geti()<<endl; cout<<"ob2.i="<<ob2.geti()<<endl; ob1.i=300; // 对象进行访问 cout<<"ob1.i="<<ob1.geti()<<endl; cout<<"ob2.i="<<ob2.geti()<<endl; return 0; }(4) 私有静态数据成员不能被类外部函数访问,也不能用对象进行访问。
(5) 支持静态数据成员的一个主要原因是可以不必使用全局变量。静态数据成员的主要用途是定义类的各个对象所公用的数据。
【例3.17】 静态数据成员和一般数据成员的不同 #include<iostream.h> class Student{ public: Student() // 构造函数 { ++count; // 每创建一个学生对象,学生数加1 StudentNo=count; // 给当前学生的学号赋值 } void print() // 成员函数,显示学生的学号和当前学生数 { cout<<"Student"<<StudentNo<<" "; cout<<"count="<<count<<endl; } private: static int count; // 静态数据成员count,统计学生的总数 int StudentNo; // 普通数据成员,用于表示每个学生的学号 }; int Student::count=0; main() { Student Student1; Student1.print(); cout<<"-----------\n"; Student Student2; Student1.print(); Student2.print(); cout<<"-----------\n"; Student Student3; Student1.print(); Student2.print(); Student3.print(); cout<<"-----------\n"; Student Student4; Student1.print(); Student2.print(); Student3.print(); Student4.print(); return 0; }执行结果为:
Student1 count=1 ------------ Student1 count=2 Student2 count=2 ------------ Student1 count=3 Student2 count=3 Student3 count=3 ------------ Student1 count=4 Student2 count=4 Student3 count=4 Student4 count=4 2. 静态成员函数可以通过定义和使用静态成员函数来访问静态数据成员。
所谓静态成员函数就是使用static关键字声明函数成员。同静态数据成员一样,静态成员函数也属整个类, 由同一个类的所有对象共同维护,为这些对象所共享。
静态成员函数作为成员函数,它的访问属性可以受到类的严格控制。对公有静态成员函数,可以通过类名或对象名来调用;而一般的非静态公有成员函数只能通过对象名来调用。
静态成员函数可以直接访问该类的静态数据成员和函数成员;而访问非静态数据成员,必须通过参数传递方式得到对象名,然后通过对象名来访问。
定义静态成员函数的格式如下static 返回类型 静态成员函数名(参数表);
使用目的: 在对象建立之前处理静态数据成员或全局变量
使用公有静态成员函数的一般格式与静态数据成员类似,使用公有静态成员函数的一般格式有如下几种:
类名::静态成员函数名(实参表)
对象. 静态成员函数名(实参表)
对象指针->静态成员函数名(实参表)
例3.18静态成员函数来访问静态数据成员 #include<iostream.h> #include<string.h> class Student { private: char *name; char *stu_no; float score; static int count; static float sum; public: Student(char *name1,char *stu_no1,float score1); ~Student(); void show(); static void show_count_sum(); }; Student::Student(char *name1,char *stu_no1,float score1 ) { name=new char[strlen(name1)+1]; strcpy(name,name1); stu_no=new char[strlen(stu_no1)+1]; strcpy(stu_no,stu_no1); score=score1; ++count; // 累加学生人数 sum=sum+score; // 累加总成绩 } Student::~Student() { delete []name; delete []stu_no; --count; sum=sum-score; } void Student::show() { cout<<"\n name: "<<name; cout<<"\n stu_no: "<<stu_no; cout<<"\n score: "<<score; } void Student::show_count_sum() // 静态成员函数 { cout<<"\n count: "<<count; // 输出静态数据成员 cout<<"\n sum: "<<sum; // 输出静态数据成员 } int Student::count=0; // 静态数据成员初始化 float Student::sum=0.0; // 静态数据成员初始化void main() { Student stu1("Liming","990201",90); stu1.show(); Student::show_count_sum(); // 使用类名访问静态成员函数 Student stu2("Zhanghao","990202",85); stu2.show(); stu2.show_count_sum(); // 使用对象stu2访问静态成员函数 } 使用静态成员函数时须注意(1) 静态成员函数可以定义成内嵌的,也可以在类外定义,在类外定义时不能用static前缀。