静态成员包括静态数据成员和静态成员函数。提出静态成员的目的是为了解决数据共享的问题。
·
·
静态数据成员
··静态数据成员是类中所有对象共享的成员,而不是某个对象的成员,也就是说静态数据成员的储存空间不是放在每个对象中的,而是和成员函数一样放在类公共区中。所以有时候静态数据成员又被称为类变量。
··对静态数据成员的操作和一般数据成员一样,定义为私有的静态数据成员不能由外界访问。静态数据成员可由任意访问权限许可的函数访问。可以在类的成员中改变静态数据成员。
··因为静态数据成员不从属于任何一个具体对象,所以必须对他初始化,而且对他的初始化不能在构造函数中进行。
·
·
··静态数据成员的使用方法如下:
(1)静态数据成员的定义与一般数据成员相似,但前面要加上static关键词。当数据成员的一个副本就已经足够时,可以使用static数据成员来节省存储空间。
(2)数据静态成员的初始化与一般数据成员不同,静态数据成员初始化的格式如下:
类型 类名::静态数据成员=数值;
(3)在引用静态数据成员时采用格式
类名::静态数据成员
·
认真分析如下实例:
#include<iostream>
using namespace std;
class my
{
int n;
public:
my(int i)
{
n=i;
}
void add()
{
s=s+n;
}
static int s;
};
int my::s=0;
int main()
{
my a(2),b(5),c(8);
a.add();
cout<<"s="<<my::s<<endl;
b.add();
cout<<"s="<<my::s<<endl;
c.add();
cout<<"s="<<my::s<<endl;
return 0;
}
从上述执行结果中我们可以看到,类my中的静态成员s不是属于某个对象a,b,c,而是属于所有对象。
·
·
·
静态成员函数
··静态成员函数与静态数据成员类似,也是从属于类,都是类的静态成员。只是类存在,静态成员函数就可以使用,静态成员函数的定义是从一般函数定义前加上static关键字。调用静态成员函数的格式如下:
类名::静成员函数名(参数表);
·
·【 注意!】静态成员函数只能访问静态数据成员、静态成员函数和类以外的函数和数据,
不能访问类中的非静态数据成员(因为非静态数据成员只有对象存在时才有意义)。但是静态数据成员和静态成员函数可由任意访问权限许可的函数访问。和一般成员函数相似,静态成员函数也有访问限制,私有静态成员函数不能由外界访问。
·
认真分析如下实例:
程序中定义对象a(2)时,通过构造函数是静态数据成员n=2,在定义对象b(5)时,通过构造函数使静态数据成员n=5(覆盖前面n=2),再执行my::add()语句使全局变量s=5。
·
【 注意!】尽管代码中静态数据成员n的初始化语句int my::n=0没有意义(因为各对象中的n值由变量i赋值),但是不能省略,否则会出现编译错误。
·
·
认真分析如下实例:
#include<iostream>
using namespace std;
class my
{
static int n;//静态数据成员
public:
my()
{
n=n+1;
}
void disp()
{
cout<<"n="<<n<<endl;
}
};
int my::n=0;//静态数据成员初始化
int main()
{
my *p=new my,s[4];
p->disp();
return 0;
}
解:先说明了my,其中有一个数据数据成员n,并给他赋初值。再main()中,先定义一个指向匿名对象的指针p(创建该匿名对象时也要自动调用my类的构造函数),另外定义了一个含有4个对象元素的数组。这样共执行构造函数5次,n累次为5.程序执行结果如下:
【经典例题】 编写一个程序,已有若干个学生数据,这些数据包括学号、姓名、语文成绩、数学成绩和英语成绩,求各门课程的平均分。要求设计不同的成员函数求各门课程的平均粉,并使用成员函数指针调用他们。
#include<iostream>
#include<cstring>
#define N 4
using namespace std;
class students
{
int no;
char name[20];
int dge1;
int dge2;
int dge3;
static int sum1;
static int sum2;
static int sum3;
static int sn;
public:
students(int n,const char na[], int d1, int d2, int d3)
{
no = n;
strcpy(name, na);
dge1 = d1;
dge2 = d2;
dge3 = d3;
sum1 += dge1;
sum2 += dge2;
sum3 += dge3;
sn++;
}
static double ave1()
{
return (sum1 * 1.0) / sn;
}
static double ave2()
{
return (sum2 * 1.0) / sn;
}
static double ave3()
{
return (sum3 * 1.0) / sn;
}
void disp()
{
cout << " " << no << "," << name << "," << dge1 << "," << dge2 << "," << dge3 << endl;
}
};
int students::sum1 = 0;
int students::sum2 = 0;
int students::sum3 = 0;
int students::sn=0;
int main()
{
students a1(1, "li", 67, 89, 90);
students a2(2, "ma", 67, 89, 90);
students a3(3, "zheng", 67, 89, 90);
students a4(4, "wan", 67, 89, 90);
cout << "输出结果" << endl;
a1.disp();
a2.disp();
a3.disp();
a4.disp();
cout << "语文平均分" << students::ave1() << endl;
cout << "数学平均分" << students::ave2() << endl;
cout << "英语平均分" << students::ave3() << endl;
return 0;
}
·
·
·
——文章转载自文本资料,仅用于个人学习
——2021年4月19日20:25