• Sales_item.h


      1 <pre name="code" class="plain"><strong><span style="font-size:14px;"><strong>#ifndef SALESITEM_H              
      2 // 若SALESITEM_H未被定义,则对其进行定义;
      3 #define SALESITEM_H
      4 // 自定义头文件Version_test;
      5 #include "Version_test.h" 
      6  
      7 //Sales_item类定义的相关函数
      8 #include <iostream>
      9 #include <string>
     10  
     11 class Sales_item {
     12 /*定义为友元函数,重载输入运算符>>;
     13 **第1个形参:运算符将要读取的流的引用;第2个形参:将要读入到的对象的引用;
     14 **第2个形参必须是非常量,因为本操作就是向此对象写入数据,此对象值会改变;
     15 */
     16 friend std::istream& operator>>(std::istream&, Sales_item&);
     17  
     18 /*定义为友元函数,重载输出运算符<<;
     19 **第1个形参:非常量ostream对象的引用;第2个形参:一个常量的引用;
     20 **第1个形参必须是非常量,因为本操作就是向流写入数据,其状态会改变;
     21 **第2个形参:引用是因为避免赋值实参;常量是因为通常打印对象不会改变对象本身的值;
     22 */
     23 friend std::ostream& operator<<(std::ostream&, const Sales_item&);
     24  
     25 /*定义为友元函数,重载关系运算符<;
     26 **第1个/第2个形参:一个常量的引用;
     27 **引用是因为避免改变实参;常量是因为比较对象并不需要改变对象本身的值;
     28 */
     29 friend bool operator<(const Sales_item&, const Sales_item&);
     30  
     31 /*定义为友元函数,重载相等运算符==;
     32 **定义两个对象是否相等,会比较对象的每一个数据成员,只有对应成员均相等时才相等;
     33 **第1个/第2个形参:一个常量的引用;
     34 **引用是因为避免改变实参;常量是因为比较对象并不需要改变对象本身的值;
     35 */
     36 friend bool operator==(const Sales_item&, const Sales_item&);
     37  
     38 //定义公共成员
     39 public:
     40 /*这种传递中的代码使用以下变量来控制编译;
     41 **变量:IN_CLASS_INITS/DEFAULT_FCNS;对应C++作用:类初始状态设置/default(默认);
     42 */
     43 #if defined(IN_CLASS_INITS) && defined(DEFAULT_FCNS)
     44 //若定义类初始值设置及默认值,则定义默认构造函数,不接受任何实参;
     45     Sales_item() = default;
     46 #else
     47 /*若未定义类初始值及默认值,则定义构造函数,函数体空;
     48 **构造函数初始列表为新创建的数据成员units_sold/revenue初始化,对应初始化值为0/0.0;
     49 */
     50     Sales_item(): units_sold(0), revenue(0.0) { }
     51 #endif
     52 /*只有一个string类型参数的构造函数,函数体空;
     53 **构造函数使用这个string对象初始化bookNo,units_sold/revenue使用类内初始值初始化;
     54 */
     55     Sales_item(const std::string &book):
     56               bookNo(book), units_sold(0), revenue(0.0) { }
     57 /*一个istream为参数的构造函数,函数体空;
     58 **函数体:从is中读取一条交易信息后存入this对象中;
     59 */
     60     Sales_item(std::istream &is) { is >> *this; }
     61 public:
     62 /* 重载运算符+=,用于对象之间的累加运算;
     63 ** 成员二元操作:左侧操作必然隐含的this指针
     64 */
     65     Sales_item& operator+=(const Sales_item&);
     66     
     67 /*常成员函数,表示只能由常成员对象访问;
     68 **对Sales_item对象进行操作,返回bookNo;
     69 */
     70     std::string isbn() const { return bookNo; }
     71     double avg_price() const;
     72 // 私有成员
     73 private:
     74 //隐式初始化为空字符串
     75     std::string bookNo;  
     76 //IN_CLASS_INITS:类初始状态设置;
     77 #ifdef IN_CLASS_INITS
     78 //显式初始化;
     79     unsigned units_sold = 0; 
     80     double revenue = 0.0;
     81 #else
     82 //定义变量;
     83     unsigned units_sold;  
     84     double revenue;       
     85 #endif
     86 };
     87  
     88 /* 二元谓词(有两个参数);
     89 **一个可调用的表达式,返回结果是一个能用作条件的值。
     90 **用于比较对象.isbn是否相等,相等返回布尔值true,否则false;
     91 */
     92 inline bool compareIsbn(const Sales_item &lhs, const Sales_item &rhs) 
     93 { return lhs.isbn() == rhs.isbn(); }
     94  
     95 // 非成员二元操作:必须声明每个操作数的参数;
     96 Sales_item operator+(const Sales_item&, const Sales_item&);
     97  
     98 /* 二元谓词(有两个参数);内联;
     99 **一个可调用的表达式,返回结果是一个能用作条件的值。
    100 ****定义==,用于对象相等;
    101 */
    102 inline bool operator==(const Sales_item &lhs, const Sales_item &rhs)
    103 {
    104     // must be made a friend of Sales_item
    105     return lhs.units_sold == rhs.units_sold &&
    106            lhs.revenue == rhs.revenue &&
    107            lhs.isbn() == rhs.isbn();
    108 }
    109  
    110 /* 二元谓词(有两个参数);内联;
    111 **一个可调用的表达式,返回结果是一个能用作条件的值。
    112 **定义!=,用于对象不相等;与==相反;
    113 */
    114 inline bool operator!=(const Sales_item &lhs, const Sales_item &rhs)
    115 {
    116     return !(lhs == rhs); 
    117 }
    118  
    119 // 假定两个对象指的是具有相同的ISBN,重载函数定义+=,用于对象+=;
    120 Sales_item& Sales_item::operator+=(const Sales_item& rhs) 
    121 {
    122     units_sold += rhs.units_sold; 
    123     revenue += rhs.revenue; 
    124     return *this;
    125 }
    126  
    127 //假定两个对象指的是具有相同的ISBN,重载函数定义定义+,用于对象+;
    128 Sales_item operator+(const Sales_item& lhs, const Sales_item& rhs) 
    129 {
    130     Sales_item ret(lhs);  
    131     ret += rhs;         
    132     return ret;           
    133 }
    134 //定义输入流>>,用于对象输入;
    135 std::istream& operator>>(std::istream& in, Sales_item& s)
    136 {
    137     double price;
    138     in >> s.bookNo >> s.units_sold >> price;
    139     // check that the inputs succeeded
    140     if (in)
    141         s.revenue = s.units_sold * price;
    142     else 
    143         s = Sales_item();  // input failed: reset object to default state
    144     return in;
    145 }
    146 //定义输出流<<,用于对象输出;
    147 std::ostream& operator<<(std::ostream& out, const Sales_item& s)
    148 {
    149     out << s.isbn() << " " << s.units_sold << " "
    150         << s.revenue << " " << s.avg_price();
    151     return out;
    152 }
    153 //定义函数avg_price;
    154 double Sales_item::avg_price() const
    155 {
    156     if (units_sold) 
    157         return revenue/units_sold; 
    158     else 
    159         return 0;
    160 }
    161 #endif
    162 </strong>
    163 </span></strong>
  • 相关阅读:
    【3y】从零单排学Redis【青铜】
    【Java】几道常见的秋招面试题
    【Java】广州三本秋招经历
    两个月的Java实习结束,继续努力
    外行人都能看懂的SpringCloud,错过了血亏!
    【Java】留下没有基础眼泪的面试题
    【Java】几道让你拿offer的知识点
    Java多线程打辅助的三个小伙子
    数据库两大神器【索引和锁】
    Linux网络管理
  • 原文地址:https://www.cnblogs.com/wsl96/p/13374174.html
Copyright © 2020-2023  润新知