• 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>
  • 相关阅读:
    python json 和 pickle的补充 hashlib configparser logging
    go 流程语句 if goto for swich
    go array slice map make new操作
    go 基础
    块级元素 行内元素 空元素
    咽炎就医用药(慢性肥厚性咽炎)
    春季感冒是风寒还是风热(转的文章)
    秋季感冒 咳嗽 怎么选药
    解决IE浏览器“无法显示此网页”的问题
    常用的 css 样式 记录
  • 原文地址:https://www.cnblogs.com/wsl96/p/13374174.html
Copyright © 2020-2023  润新知