【学习心得】面向对象的程序设计中静态数据成员以及静态成员函数在统计中的作用

来源:互联网 发布:ubuntu emacs安装 编辑:程序博客网 时间:2024/04/28 00:14

在面向对象的程序设计中,允许程序员在类的定义中定义静态数据成员以及静态成员函数。静态数据成员不属于某个对象,而属于一个类,为所有对象所共享。很容易地就可以联想到,静态数据成员的这一特性可以用于统计。以下以一个简单的例子来阐述静态数据成员以及静态成员函数在统计方面的作用。

商店销售一种商品,允许销售员在允许的范围内自定义价格,已知三名销售员的销售数据如下所示:

销售员号                    销售件数                        销售单价

S101                          5                                      23.5

S102                          12                                    24.56

S103                          100                                  21.5

计算每件商品的平均售价。

这里我们就可以将销售数目与销售额定义为静态数据成员,这个成员属于类而不属于某个特定的对象,对象的成员函数(无论是否是静态成员函数)都可以引用它或者改变它的值。

源代码如下:

//sale.h
#include <string>
using namespace std;
//以下是类的定义
class sale
{
public:
sale(string, int, float);
~sale(void);
static float average(void);          //定义一个静态成员函数,处理静态数据成员
static void display(void);           //以一定的格式输出静态数据成员
void sumup(void);                    //由于要处理非静态数据成员,所以sumup函数不可以定义为静态
private:
static int acount;                   //定义一个属于类的静态数据成员,计算卖出商品的数目
static float sum;                    //定义一个属于类的静态数据成员,计算卖出商品的总价值
string num;                          //表示销售员编号的字符串
bool flag;                           //这是一个标志项,用以防止一个销售员的销售数据因误操作被一次以上地统计
int hm;                              //该销售员的销售数目
float perprice;                      //该销售员卖出商品的平均价格
};
//funidentify.cpp
//以下是类定义中所声明的函数的函数体
#include <iostream>
#include <iomanip>
#include <string>
#include "sale.h"
using namespace std;
sale::sale(string nu, int n, float per) :num(nu), hm(n), perprice(per){ flag = true; } //构造函数
sale::~sale(){}                                                                        //析构函数
void sale::sumup(void)                                                                 //统计商品销售数量与销售额
{
if (flag == true)                                                                  //这里,flag标志项起到作用,当标志项为真时才统计
{
sum += (hm*perprice);
acount += hm;
flag = false;                                                                  //一旦销售员的销售数据被统计,标志项应当改变
}
}
int sale::acount = 0;                                                                  
float sale::sum = 0;                                                                   //这两行是对静态数据成员的初始化
float sale::average(void)                                                              //计算平均价格的函数
{
return sum/acount;
}
void sale::display(void)                                                               //输出到屏幕
{
cout << "the average price is " <<average()<< endl;
}
//main.cpp
//以下是主函数
#include "sale.h"
using namespace std;
const int N = 3;                          //定义一个静态全局变量N,为销售员的数目
int main()
{
sale salesman[N] = {                  //对象的初始化
sale("101",5,23.5),
sale("102",12,24.56),
sale("103",100,21.5)
};
int i;
for (i = 0; i < N; i++)
(salesman + i)->sumup();          //通过循环语句以实现销售额与销售数目的统计
//(salesman + i-1)->sumup();          //如果这行语句不被注释,事实上也无法改变输出值,这是设置flag标志项的作用                
sale::display();                      //输出
system("pause");
return 0;
}




0 0