C++_静态成员

引入目的:实现一个类的不同对象之间数据和函数共享

谁共享:本类所有对象。

静态数据成员

用关键字static声明

该类的所有对象维护该成员的同一个拷贝

必须在类外定义和初始化,用(::)来指明所属的类。

静态成员函数

类外代码可以使用类名和作用域操作符来调用公有静态成员函数。

静态成员函数只能引用属于该类的静态数据成员或静态成员函数。访问非静态数据成员,必须通过参数传递方式得到对象名,通过对象名访问。

1. 静态数据成员 为何需要静态数据成员? 例 静态数据成员的引例 #include<iostream.h> #include<string.h> class Student { public: Student(char *name1,char *stu_no1,float score1); ~Student(); void show(); // 输出姓名、 学号和成绩 void show_count_sum_ave(); // 输出学生人数 private: char *name; // 学生姓名 char *stu_no; // 学生学号 float score; // 学生成绩 int count; float sum; float ave; }; 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; // 累加总成绩 ave=sum/count; // 计算平均成绩 } 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_ave() { cout<<"\n count: "<<count; cout<<"\n sum: "<<sum; cout<<"\n ave: "<<ave; } void main() { Student stu1("Liming","990201",90); stu1.show(); stu1.show_count_sum_ave(); Student stu2("Zhanghao","990202",85); stu2.show(); stu2.show_count_sum_ave(); } 如何定义静态数据成员?

在一个类中,若将一个数据成员说明为static,这种成员称为静态数据成员。

静态数据成员特点?

与一般的数据成员不同,无论建立多少个类的对象,都只有一个静态数据的拷贝。从而实现了同一个类的不同对象之间的数据共享

它不因对象的建立而产生,也不因对象的析构而删除。它是类定义的一部分,所以使用静态数据成员不会破坏类的隐蔽性。

在类的声明中只能声明静态数据成员的存在。由于类的声明是抽象的,静态数据成员的初始化需要在类的外部进行, 通过类名对它进行访问

静态数据成员初始化的格式

∷=;

初始化时不加该成员的访问权限控制符private,public等。

初始化时使用作用域运算符来标明它所属的类,因此,静态数据成员是类的成员,而不是对象的成员。

引用静态数据成员时,采用如下格式:

如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员。

例3.15 静态数据成员的使用引例 #include<iostream.h> #include<string.h> class Student { public: Student(char *name1,char *stu_no1,float score1); ~Student(); void show(); // 输出姓名、 学号和成绩 void show_count_sum_ave(); // 输出学生人数 private: char *name; // 学生姓名 char *stu_no; // 学生学号 float score; // 学生成绩 static int count; // 静态数据成员,统计学生人数 static float sum; // 静态数据成员,统计总成绩 static float ave; // 静态数据成员,统计平均成绩 }; 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; // 累加总成绩 ave=sum/count; // 计算平均成绩 } 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_ave() { cout<<"\n count: "<<count; // 输出静态数据成员count cout<<"\n sum: "<<sum; // 输出静态数据成员sum cout<<"\n ave: "<<ave; // 输出静态数据成员ave } int Student::count=0; // 静态数员count初始化 float Student::sum=0.0; // 静态数员sum初始化 float Student::ave=0.0; // 静态数员ave初始化 void main() { Student stu1("Liming","990201",90); stu1.show(); stu1.show_count_sum_ave(); Student stu2("Zhanghao","990202",85); stu2.show(); stu2.show_count_sum_ave(); } 如何使用静态数据成员?

(1)静态数据成员的定义与一般数据成员相似,但前面要加上static关键词。

static 数据类型 数据成员名;

(2)静态数据成员的初始化与一般数据成员不同。

初始化格式: 数据类型 类名::静态数据成员=值;

初始化位置:定义对象之前,一般在类定义后,main()前进行。

(3) 访问方式(只能访问公有静态数据成员)

可用类名访问: 类名::静态数据成员

也可用对象访问:

对象名.静态数据成员

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyfyf.html