目录
定义
静态成员分为静态数据成员和静态成员函数。静态成员的特征是不管这个类创建了多少个对象,而其静态成员只有一个副本,这个副本被这个类的所有对象共享。
静态数据成员
静态数据成员被存在内存的某一单元内,该类的所有对象都可以访问他。在没有建立该类对象的时候,静态数据成员的存储空间是仍然存在的。静态数据成员可以看作是一个全局变量(注意:含有数据成员的类在定义对象时,不会再为静态数据成员分配存储空间)
静态数据成员的初始化在类外进行,格式为:
<数据类型><类名>::<静态数据成员>=(初始值)
将数据成员封存在类中的目的是:
1.限制变量的作用范围。
2.将意义相关的全局变量和物理操作放在一起,可以增加程序的可读性和维护性。
注意:将程序分为多块编译的时候,需要将类和静态成员的初始化放在不同的地方,否则会使静态数据成员重复初始化。
静态成员函数
静态成员函数与静态数据成员类似,可以把它看作是静态数据成员,将他封存在类中的目的与静态数据成员的目的一样。
静态成员函数的特点:
1.静态成员函数没有this指针,所以他不能直接访问非静态的数据成员,必须要通过该类的对象访问。
2.在静态成员函数中访问的都是静态数据成员或全局变量。
3.在调用静态成员函数的时候必须缀上对象名或者类名,一般采用类名
4.不需要定义对象就可以被调用。
5.非静态成员函数不能和非静态成员函数有相同的名字和参数类型。
相关程序应用
商店销售某一商品,商店每天公布统一的折扣(discount)。同时允许销售人员在销售时灵活掌握售价(price),在此基础上,对一次购10件以上者,还可以享受9.8折优惠。现已知当天3名销货员的销售情况为:
销货员号(num) 销货件数(quantity) 销货单价(price)
101 5 23.5
102 12 24.56
103 100 21.5
请编程序,计算出当日此商品的总销售款sum,以及每件商品的平均售价。要求用静态数据成员和静态成员函数。
提示: 将折扣discount、总销售款sum和商品销售总件数n声明为静态数据成员,再定义静态成员函数average(求平均售价)和display(输出结果)。每天商店都有一个折扣discount,这是指无论消费者买几件商品都能够享受到的折扣,相当于“只要你买我就打折”的意思,如果一次买得多,超过10件,就享受折上折,价格上再给你个98折。
因为discount每天可能不同(根据节假日会动态调整),
所以discount这个折扣是键盘输入的。
例如:discount定为95折,则键盘输入0.95
101号销货员销售的货款为 : 5*23.5*0.95=111.625元
102号销货员销售的货款为 : 12*24.56*0.95*0.98=274.38432元
#include<iostream>
using namespace std;
class thing
{
public:
thing(int a,float b):quality(a),price(b){};
static float average();
static void display();
static void set();
void total();
private:
int quality;
float price;
static float sum;
static float discount;
static int n;
};
void thing::set()
{
cout<<"今天的统一折扣是:"<<endl;
cin>>discount;
}
float thing::average()
{
return sum/n;
}
void thing::display()
{
cout<<"今天的总销售额是:"<<endl;
cout<<sum<<endl;
cout<<"每件商品的平均售价是:"<<endl;
cout<<average()<<endl;
}
void thing::total()
{
n+=quality;
if(quality>=10)
{
sum=sum+quality*price*discount*0.98;
}
else sum=sum+quality*price*discount;
}
float thing::sum = 0;
float thing::discount = 1.0;
int thing::n = 0;
int main()
{
thing::set();
thing a[3]={thing(5,23.5),thing(12,24.56),thing(100,21.5)};
for(int i=0;i<3;i++)
{
a[i].total();
}
thing::average();
thing::display();
return 0;
}