【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;
}


运行结果



相关文章
|
10月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
212 2
|
11月前
|
存储 C++
UE5 C++:自定义Http节点获取Header数据
综上,通过为UE5创建一个自定义HTTP请求类并覆盖GetResult方法,就能成功地从HTTP响应的Header数据中提取信息。在项目中使用自定义类,不仅可以方便地访问响应头数据,也可随时使用这些信息。希望这种方法可以为你的开发过程带来便利和效益。
434 35
|
9月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
235 0
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
745 6
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
490 12
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
251 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
347 5
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
383 5
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
690 6