售货员习题对关于类的静态数据和成员函数的总结-20120917

来源:互联网 发布:网络发送短信 编辑:程序博客网 时间:2024/06/07 16:27

最近,谭浩强的售货员卖东西的习题,看起来挺简单的,但是自己做起来却花了比较长的时间,在此做一个总结。

先上习题:

================================================================================

 9. 商店销售某一商品, 商店每天公布统一的折扣(discount)。 同时允许销售人员在

售时灵活掌握售价(price), 在此基础上, 对一次购10件以上者, 还可以享受9.8折优惠。

现已知当天名销货员的销售情况为:

销货员号(num) 销货件数(quantity) 销货单价(price) 

101                      5 2                                                    3.5
102                      12                                                     24.56
103                       100                                                21.5 

 请编程序, 计算出当日此商品的总销售款sum, 以及每件商品的平均售价。要求用静态数

据成员和静态成员函数。 

=============================================================================================

要求使用静态成员静态成员函数,首先必须弄清楚哪些要做为静态的变量。静态成员根本的意义就在于:所有的对象都是使用

这个变量,它的值一改变,所有对象引用它的值均会改变。它是独立于对象的,属于类的。

它的内存空间和对象的空间是单独开辟的,所以初始化的时候必须要用类来进行初始化而不是用对象。

class Price{public:static float discount_index;//定义一个静态的discount_index变量};float Price::discount_index=0.98;//<类型> classname::<静态变量>;


明白了静态成员的作用则可以定义本题中的静态变量,原则就是:所有对象所公用的数据

1.商品的总销售量 total_quantity

 2.商品的总价        total_price

3.商品的平均价     average_price

另外,对于每个员工来说固有的属性有:

1.工号 number

2.销售件数 quantity

3.单价 unit_price

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

另外一个就是静态的成员函数,静态成员函数也是独立于对象,归属于类的函数。

在此不得不提到this指针:简单来说,this指针就是起到,告诉成员函数该去引用哪个对象做为参数的作用。

class Time{   public:    void show_time();//假设show_time已经定义  private:     int hour;     int minute;};Time t1,t2;t1.show_time();t2.show_time();

系统是如何知道该调用哪个对象的时间?

系统的处理是:

void show_time(Time *this) //this指针

   cout<<this->hour<<endl;

   cout<<this->minute<<endl;

}

Time *this=&t1;

但是对于静态成员函数来说,是没有this指针的,没有this指针是什么意思?

static void Show_time();如何调用hour和minute?无法通过地址赋值,所以无法访问。

static void Show_time();又是如何访问static的成员的呢?

百度了一下:

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

我是JAVA程序员,我就从JAVA方面说吧.这与静态数据的存放位置和绑定机制有关,JAVA是动态绑定的,只有到运行的时候才真正知道要去找哪个成员的实现,而把数据成员声明成静态的则是实现"静态绑定"的一种方法,这就是为什么声明成静态的可以提高速度的原因了.因为静态函数也归署于静态绑定(事先就知道我要用的变量在哪),所以他只能访问静态变量!
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

在编译时,常规成员数据变量地址的分配时动态的,但是对于static的变量,他的地址是确定的,所以静态的成员函数可以访问静态的成员,

这个是我自己的理解。

//要求使用静态变量和静态成员函数//流程://员工属性:工号  销售件数 销售单价 每个都不同//共同属性:总销量  打折数目 平均价格 总价#include <iostream>using namespace std;//定义Sale类class Sale{public:Sale(int number,int quantity,float price);static void total_quantity(Sale *p);static void total_price(Sale *p,float);static void average_price(float,int);static void display();//private:int number;int quantity;float price;static double discount_index;//diplay需要输出的变量static int all_quantity;static float all_price;static float all_average;};int Sale::all_quantity=0;float Sale::all_price=0;float Sale::all_average=0;//定义员工属性的构造函数Sale::Sale(int number,int quantity,float price):number(number),quantity(quantity),price(price){}//静态成员discount_index赋值不可通过构造函数,静态成员只是类的而不是对象的double Sale::discount_index=0.98;//定义diplay函数void Sale::display(){cout<<"The all quantity is"<<Sale::all_quantity<<endl;cout<<"The all_price is"<<Sale::all_price<<endl;cout<<"The all_average is"<<Sale::all_average<<endl;}//定义销售总数量的函数,static函数定义方法有点不同,可能无法访问private数据void Sale::total_quantity(Sale *p){ Sale::all_quantity=p->quantity+(p+1)->quantity+(p+2)->quantity;}//得出总的价格,对于买了10件以上的会discount//默认的discount为0.98,判断是否超过10件,超过了dicount不变,未超过discont为1void Sale::total_price(Sale *p,float discount){int i;  float sum;      for(i=0,sum=0;i<3;i++)  {  float temp=discount;  if((p+i)->quantity<=10) temp=1;  sum+=((p+i)->quantity)*((p+i)->price)*temp;  } all_price=sum; }//平均价格=总价÷总数量  void Sale::average_price(float total_price,int total_quantity){ all_average=total_price/total_quantity;}//main函数main(){Sale Saler[3]={Sale(101,5,23.5),Sale(102,12,24.56),Sale(103,100,21.5)};Sale *pointer=Saler;//得出总的销量Sale::total_quantity(pointer);//得出总的价格Sale::total_price(pointer,Sale::discount_index);//得出平均价  Sale::average_price(Sale::all_price,Sale::all_quantity);Sale::display();return 0;}
1.static的数据成员必须要进行初始化,不然编译会报错

2.引用静态成员函数要明确他的类即作用域的问题

3.员工的工号并未使用

 

 

原创粉丝点击