【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 型的类的成员称为静态成员,它不只属于某个对象,而是属于整个类的对象,为某个类的所有对象共享。
如果想在同类的多个对象之间实现数据共享,也不用全局变量,可以用静态的数据成员。
静态成员有两种: 静态数据成员、静态成员函数。

静态数据成员

  1. 静态数据成员定义格式:
static 类型 数据成员名

例如:

static int n;          // 静态数据成员:商品销售总件数
static float sum;      // 静态数据成员:总销售款
static float discount; // 静态数据成员:折扣
  1. 静态数据成员可以初始化,但只能在类外专门对其初始化。
    格式:
数据类型 类名::静态数据成员名 = 初值;

例如:

int Sale::n = 0;
float Sale::sum = 0;
float Sale::discount = 0.01;

如果未对静态数据成员赋初值,编译系统会自动赋予初值0。
注意不能用参数初始化表对静态数据成员初始化。

静态成员函数

静态成员函数可以访问静态数据成员,它不属于某个对象而属于类的所有对象
类中的非静态成员函数可以访问类中所有数据成员;而静态成员函数可以直接访问类的静态成员,不能直接访问非静态成员

  1. 静态成员函数定义格式:
static 类型 成员函数(形参表){…}

例如:

static float average(); // 静态成员函数:求平均售价
static void  display(); // 静态成员函数:输出结果
  1. 在类外调用公有静态成员函数的格式:
    类名::静态成员函数 (实参表)
    例如:
    Sale::display(); // 调用静态成员函数 display
    也可以用对象来引用,但使用的是它的类型:
对象名.静态成员函数 (实参表)
  1. 静态成员函数的实现中能直接引用静态成员,但不能直接引用非静态成员。
    例如:

    float Sale::average() // 定义静态成员函数 average()
    {
     // 静态成员函数可以直接引用本类的静态成员
     return (sum / n);
    }
    void Sale::display() // 定义静态成员函数 display()
    {
     // 静态成员函数可以直接引用本类的静态成员
     cout << "Average:" << average() << endl; 
     cout << "Sum:" << sum << endl;
    }
  2. 一般在C++程序中,只用静态成员函数引用静态数据成员,而不引用非静态数据成员。

程序

/*
**************************************************************************
@file:    sale.cpp
@date:   2020.11.18
@author: Xiaoxiao
@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;
}

运行结果

图片说明

输出:
Average:21.2666
Sum:2488.19

【腾讯云】新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。

#C/C++##c++#
C++学习 文章被收录于专栏

c++面向对象程序设计课, 作业题选自谭浩强的《c++面向对象程序设计》(第2版)

全部评论
计算商品总销售款
点赞 回复 分享
发布于 2022-08-28 13:45 河南

相关推荐

代码飞升:别用口语,后端就写后端,前端就写前端,最后别光后悔
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务