题目要求
商店销售某一商品,商店每天公布统一的折扣(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 (输出结果)。
——谭浩强的《C++面向对象程序设计》第3章习题第9小题
静态成员
声明为 static 型的类的成员称为静态成员,它不只属于某个对象,而是属于整个类的对象,为某个类的所有对象共享。
如果想在同类的多个对象之间实现数据共享,也不用全局变量,可以用静态的数据成员。
静态成员有两种: 静态数据成员、静态成员函数。
静态数据成员
静态数据成员定义格式:
static 类型 数据成员名
例如:
static int n; // 静态数据成员:商品销售总件数 static float sum; // 静态数据成员:总销售款 static float discount; // 静态数据成员:折扣
静态数据成员可以初始化,但只能在类外专门对其初始化。
格式:
数据类型 类名::静态数据成员名 = 初值;
例如:
int Sale::n = 0; float Sale::sum = 0; float Sale::discount = 0.01;
如果未对静态数据成员赋初值,编译系统会自动赋予初值0。
注意不能用参数初始化表对静态数据成员初始化。
静态成员函数
静态成员函数可以访问静态数据成员,它不属于某个对象而属于类的所有对象。
类中的非静态成员函数可以访问类中所有数据成员;而静态成员函数可以直接访问类的静态成员,不能直接访问非静态成员。
静态成员函数定义格式:
static 类型 成员函数(形参表){…}
例如:
static float average(); // 静态成员函数:求平均售价 static void display(); // 静态成员函数:输出结果
在类外调用公有静态成员函数的格式:
类名::静态成员函数 (实参表)
例如:
Sale::display(); // 调用静态成员函数 display
也可以用对象来引用,但使用的是它的类型:
对象名.静态成员函数 (实参表)
静态成员函数的实现中能直接引用静态成员,但不能直接引用非静态成员。
例如:
float Sale::average() // 定义静态成员函数 average() { // 静态成员函数可以直接引用本类的静态成员 return (sum / n); } void Sale::display() // 定义静态成员函数 display() { // 静态成员函数可以直接引用本类的静态成员 cout << "Average:" << average() << endl; cout << "Sum:" << sum << endl; }
一般在C++程序中,只用静态成员函数引用静态数据成员,而不引用非静态数据成员。
程序
/* ************************************************************************** @file: sale.cpp @date: 2020.11.18 @author: Xiaoxiao @blog: https://blog.csdn.net/weixin_43470383/article/details/109698224 @brief: 计算商品总销售款和平均售价 ************************************************************************** */ #include <iostream> using namespace std; class Sale { private: static int n; // 静态数据成员:商品销售总件数 static float sum; // 静态数据成员:总销售款 static float discount; // 静态数据成员:折扣 int num; // 非静态数据成员:销货员号 int quantity; // 非静态数据成员:销货件数 float price; // 非静态数据成员:销货单价 public: Sale(int n, int q, float p) :num(n), quantity(q), price(p) {}; // 定义构造函数 void total(); // 非静态成员函数:求总销售款 static float average(); // 静态成员函数:求平均售价 static void display(); // 静态成员函数:输出结果 }; int main() { Sale salesman[3] = { // 定义对象数组,参考我的上两篇博客 Sale(101, 5, 23.5), // 调用构造函数,提供第1个元素的实参 Sale(102, 12, 24.56), // 调用构造函数,提供第2个元素的实参 Sale(10., 100, 21.5) // 调用构造函数,提供第3个元素的实参 }; for (int i = 0; i < 3; i++) salesman[i].total(); // 调用3次 total 函数 Sale::display(); // 调用静态成员函数 display system("pause"); return 0; } // 静态数据成员初始化 int Sale::n = 0; float Sale::sum = 0; float Sale::discount = 0.01; void Sale::total() // 定义非静态成员函数 total() { float rate = 1.0; if (quantity>10) rate = 0.98 * rate; // 一次性购10件以上,享受98折优惠 sum = sum + quantity * price * rate * (1 - discount); // 计算销售额:销货件数 * 单价 * 折扣 n = n + quantity; // 累加销货件数 } float Sale::average() // 定义静态成员函数 average() { // 静态成员函数可以直接引用本类的静态成员 return (sum / n); } void Sale::display() // 定义静态成员函数 display() { // 静态成员函数可以直接引用本类的静态成员 cout << "Average:" << average() << endl; cout << "Sum:" << sum << endl; }
运行结果