zoukankan      html  css  js  c++  java
  • C++ Primer第五版学习笔记七 类简介(编译用到C++11特性,编译命令需要加-std=c++11参数,break结束while)

    定义一个类:Sales_item

    用来表示一本书的总销售额,售出册数,平均售价

    Sales_item类有以下功能:

    ● 调用isbn函数,获取一本书的ISBN书号

    ● 使用 >> 和 << 操作符可读写Sales_item类型对象

    ● 使用 = 赋值运算符可以将一个Sales_item对象的值赋给另一个Sales_item对象

    ● 使用 + 运算符将两个书号相同的Sales_item对象的总销售额和售出册数相加,生成一个新的Sales_item对象

    ● 使用 += 运算符将一个Sales_item对象加到另一个对象上(书号相同的对象)

    下面的sales_item.h文件内容是从该书的网站上(http://www.informit.com/title/0321714113)拷贝的,先不在意其内容含义,主要体会如何使用一个自定义的类

    sales_item.h

    /*
     * This file contains code from "C++ Primer, Fifth Edition", by Stanley B.
     * Lippman, Josee Lajoie, and Barbara E. Moo, and is covered under the
     * copyright and warranty notices given in that book:
     * 
     * "Copyright (c) 2013 by Objectwrite, Inc., Josee Lajoie, and Barbara E. Moo."
     * 
     * 
     * "The authors and publisher have taken care in the preparation of this book,
     * but make no expressed or implied warranty of any kind and assume no
     * responsibility for errors or omissions. No liability is assumed for
     * incidental or consequential damages in connection with or arising out of the
     * use of the information or programs contained herein."
     * 
     * Permission is granted for this code to be used for educational purposes in
     * association with the book, given proper citation if and when posted or
     * reproduced.Any commercial use of this code requires the explicit written
     * permission of the publisher, Addison-Wesley Professional, a division of
     * Pearson Education, Inc. Send your request for permission, stating clearly
     * what code you would like to use, and in what specific way, to the following
     * address: 
     * 
     *     Pearson Education, Inc.
     *     Rights and Permissions Department
     *     One Lake Street
     *     Upper Saddle River, NJ  07458
     *     Fax: (201) 236-3290
    */ 
    
    /* This file defines the Sales_item class used in chapter 1.
     * The code used in this file will be explained in
     * Chapter 7 (Classes) and Chapter 14 (Overloaded Operators)
     * Readers shouldn't try to understand the code in this file
     * until they have read those chapters.
    */
    
    #ifndef SALESITEM_H
    // we're here only if SALESITEM_H has not yet been defined 
    #define SALESITEM_H
    
    // Definition of Sales_item class and related functions goes here
    #include <iostream>
    #include <string>
    
    class Sales_item {
    // these declarations are explained section 7.2.1, p. 270 
    // and in chapter 14, pages 557, 558, 561
    friend std::istream& operator>>(std::istream&, Sales_item&);
    friend std::ostream& operator<<(std::ostream&, const Sales_item&);
    friend bool operator<(const Sales_item&, const Sales_item&);
    friend bool 
    operator==(const Sales_item&, const Sales_item&);
    public:
        // constructors are explained in section 7.1.4, pages 262 - 265
        // default constructor needed to initialize members of built-in type
        Sales_item() = default;
        Sales_item(const std::string &book): bookNo(book) { }
        Sales_item(std::istream &is) { is >> *this; }
    public:
        // operations on Sales_item objects
        // member binary operator: left-hand operand bound to implicit this pointer
        Sales_item& operator+=(const Sales_item&);
        
        // operations on Sales_item objects
        std::string isbn() const { return bookNo; }
        double avg_price() const;
    // private members as before
    private:
        std::string bookNo;      // implicitly initialized to the empty string
        unsigned units_sold = 0; // explicitly initialized
        double revenue = 0.0;
    };
    
    // used in chapter 10
    inline
    bool compareIsbn(const Sales_item &lhs, const Sales_item &rhs) 
    { return lhs.isbn() == rhs.isbn(); }
    
    // nonmember binary operator: must declare a parameter for each operand
    Sales_item operator+(const Sales_item&, const Sales_item&);
    
    inline bool 
    operator==(const Sales_item &lhs, const Sales_item &rhs)
    {
        // must be made a friend of Sales_item
        return lhs.units_sold == rhs.units_sold &&
               lhs.revenue == rhs.revenue &&
               lhs.isbn() == rhs.isbn();
    }
    
    inline bool 
    operator!=(const Sales_item &lhs, const Sales_item &rhs)
    {
        return !(lhs == rhs); // != defined in terms of operator==
    }
    
    // assumes that both objects refer to the same ISBN
    Sales_item& Sales_item::operator+=(const Sales_item& rhs) 
    {
        units_sold += rhs.units_sold; 
        revenue += rhs.revenue; 
        return *this;
    }
    
    // assumes that both objects refer to the same ISBN
    Sales_item 
    operator+(const Sales_item& lhs, const Sales_item& rhs) 
    {
        Sales_item ret(lhs);  // copy (|lhs|) into a local object that we'll return
        ret += rhs;           // add in the contents of (|rhs|) 
        return ret;           // return (|ret|) by value
    }
    
    std::istream& 
    operator>>(std::istream& in, Sales_item& s)
    {
        double price;
        in >> s.bookNo >> s.units_sold >> price;
        // check that the inputs succeeded
        if (in)
            s.revenue = s.units_sold * price;
        else 
            s = Sales_item();  // input failed: reset object to default state
        return in;
    }
    
    std::ostream& 
    operator<<(std::ostream& out, const Sales_item& s)
    {
        out << s.isbn() << " " << s.units_sold << " "
            << s.revenue << " " << s.avg_price();
        return out;
    }
    
    double Sales_item::avg_price() const
    {
        if (units_sold) 
            return revenue/units_sold; 
        else 
            return 0;
    }
    #endif

     Sales_item类的使用(编译需要用到C++11特性,编译命令:g++ main.cpp -std=c++11  -o test)

    读写Sales_item

    #include <iostream>
    #include "sales_item.h" // 使用""来引入非标准库头文件
    
    int main() {
    
        Sales_item book;
    
        std::cout << "请输入:书号 册数 单价:" << std::endl;
        std::cin >> book;
    
        std::cout << book << std::endl;
    
        return 0;
    }

     Sales_item对象的加法

    #include <iostream>
    #include "sales_item.h"
    
    int main() {
    
        Sales_item item1,item2;
    
        std::cout << "请输入:书号 册数 单价:" << std::endl;
        std::cin >> item1 >> item2;
    
        std::cout << item1 + item2 << std::endl;
    
        return 0;
    }

    练习:读取两个书号相同Sales_item对象,输出它们的和

    #include <iostream>
    #include "sales_item.h"
    
    int main() {
    
        Sales_item item1,item2;
    
        std::cout << "请输入:书号 册数 单价:" << std::endl;
        std::cin >> item1 >> item2;
    
        if(item1.isbn() == item2.isbn()){
            std::cout << item1 + item2 << std::endl;
        }
        else{
            std::cout << "书号不同,无法相加" << std::endl;
        }
    
        return 0;
    }

    练习:读取多个具有相同书号的销售记录,输出所有记录的和

    #include <iostream>
    #include "sales_item.h"
    
    int main() {
    
        Sales_item countItem,item;
    
        std::cout << "请输入:书号 册数 单价:" << std::endl;
        std::cin >> countItem;
        while(std::cin >> item){
            if(countItem.isbn() == item.isbn()){
                countItem += item;
            }
            else{
                std::cout << "书号不同,结束相加" << std::endl;
                break;
            }
        }
    
        std::cout << countItem << std::endl;
    
        return 0;
    }

     类的成员函数也叫类的方法,类对象使用.运算符来进行调用,点运算符只能用于类类型的对象

    练习:读取多条销售记录,统计相同书号的销售记录数(与笔记六类似,没有将间隔书号相同的销售记录累计)

    #include <iostream>
    #include "sales_item.h"
    
    int main() {
    
        Sales_item currentItem,item;
        int count;
    
        std::cout << "请输入:书号 册数 单价:" << std::endl;
        std::cin >> currentItem;
        count = 1;
        while(std::cin >> item){
            if(currentItem.isbn() == item.isbn()){
                ++count;
            }
            else{
                std::cout << "书号:" << currentItem.isbn() << "的销售记录条数是" << count << std::endl;
                currentItem = item;
                count = 1;
            }
        }
    
        std::cout << "书号:" << currentItem.isbn() << "的销售记录条数是" << count << std::endl;
    
        return 0;
    }
  • 相关阅读:
    jQuery EasyUI API 中文文档 可调整尺寸
    jQuery EasyUI API 中文文档 链接按钮(LinkButton)
    jQuery EasyUI API 中文文档 手风琴(Accordion)
    jQuery EasyUI API 中文文档 表单(Form)
    jQuery EasyUI API 中文文档 组合(Combo)
    jQuery EasyUI API 中文文档 布局(Layout)
    jQuery EasyUI API 中文文档 拆分按钮(SplitButton)
    jQuery EasyUI API 中文文档 菜单按钮(MenuButton)
    jQuery EasyUI API 中文文档 搜索框
    jQuery EasyUI API 中文文档 验证框(ValidateBox)
  • 原文地址:https://www.cnblogs.com/liyunfei0103/p/9090852.html
Copyright © 2011-2022 走看看