【C++之静态数据成员和静态成员函数】计算商品总销售款和平均售价

简介: 【C++之静态数据成员和静态成员函数】计算商品总销售款和平均售价

题目要求


商店销售某一商品,商店每天公布统一的折扣(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;
}


运行结果



相关文章
|
1天前
|
C++ 编译器 程序员
C++ 从零基础到入门(3)—— 函数基础知识
C++ 从零基础到入门(3)—— 函数基础知识
|
6天前
|
自然语言处理 编译器 C语言
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
本文章是我对C++学习的开始,很荣幸与大家一同进步。 首先我先介绍一下C++,C++是上个世纪为了解决软件危机所创立 的一项面向对象的编程语言(OOP思想)。
32 1
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
|
7天前
|
存储 算法 对象存储
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
14 1
|
7天前
|
存储 算法 数据安全/隐私保护
【C++入门到精通】 哈希结构 | 哈希冲突 | 哈希函数 | 闭散列 | 开散列 [ C++入门 ]
【C++入门到精通】 哈希结构 | 哈希冲突 | 哈希函数 | 闭散列 | 开散列 [ C++入门 ]
7 0
|
7天前
|
存储 自然语言处理 C++
刷题用到的非常有用的函数c++(持续更新)
刷题用到的非常有用的函数c++(持续更新)
16 1
|
7天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
17 0
|
8天前
|
C语言 C++
【C++】string类(常用接口)
【C++】string类(常用接口)
21 1
|
5天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
7 1