【c++ primer, 5e】

练习

7.6 & 7.7

#include <iostream>
#include <string>
using namespace std;

// Sales_data.h
struct Sales_data {
    // public部分,对象看起来是怎么样的。
    std::string isbn() const { return bookNo; } // inline function
    Sales_data& combine(const Sales_data&);
    double avg_price() const;
    // private部分,数据成员。
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};
// Sales_data的非成员接口函数
Sales_data add(const Sales_data&, const Sales_data&);
std::ostream &print(std::ostream&, const Sales_data&);
std::istream &read(std::iostream&, Sales_data&);

// Sales_data.cpp
Sales_data& Sales_data::combine(const Sales_data &rhs)
{
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;
    return *this;
}
istream &read(istream &is, Sales_data &item)
{
    double price = 0;
    is >> item.bookNo >> item.units_sold >> price;
    item.revenue = price * item.units_sold;
    return is;
}
ostream &print(ostream &os, const Sales_data &item)
{
    os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price();
    return os;
}
double Sales_data::avg_price() const {
    if (units_sold)
        return revenue/units_sold;
    else
        return 0;
}
Sales_data add(const Sales_data &lhs, const Sales_data &rhs)
{
    Sales_data sum = lhs;
    sum.combine(rhs);
    return sum;
}

// main.cpp
int main()
{
    Sales_data total;
    if (read(cin, total)) {
        Sales_data trans;
        while (read(cin, trans)) {
            if (total.isbn() == trans.isbn())
                total.combine(trans);
            else {
                print(cout, total) << endl;
                total = trans;
            }
        }
        print(cout, total) << endl;
    } else {
        cerr << "No data?!" << endl;
    }
    return 0;
}

7.8

read操作会改变对象的数据成员,而print操作仅仅是“访问”而不改变对象的数据成员。

时间: 2024-10-14 10:51:44

【c++ primer, 5e】的相关文章

【c++ primer, 5e】访问控制与封装

练习 7.16 无,类的接口定义在public说明符之后,类的实现细节定义在private说明符之后. 7.17 有.类成员的默认访问权限不同.class的类成员默认为private,struct的则默认为public. 通常来说,当我们希望定义的类的所有成员是public的时候就用struct. 7.18 p242 7.19 [友元] 练习 7.20 声明的类外函数需要直接引用类内的私有成员的时候要用到友元函数. 设计原因:并非所有的.与某个类相关的函数都适合声明成那个类的成员函数,例如书上的

【c++ primer, 5e】构造函数 &amp; 拷贝、赋值和析构

[构造函数] 1.构造器就是创建对象时被调用的代码. 2.如果没有自定义构造器,那么编译器将自动合成一个默认的无参构造器. 3.自定义的构造器不允许加const,所创建const的对象只有在构造器代码执行完后,才被赋予const性质. 4.如果自定义了构造器,那么默认的构造器将无效化,可以理解为自定义内容覆盖了默认的内容. 5.构造函数使用类内初始值并不是一个坏选择. 6.default. 7.构造函数初始值列表. [拷贝.赋值和析构] 如果我们不主动定义这些操作,那么编译器将会替我们合成它们.

【c++ primer, 5e】函数指针

简单的示例: #include <iostream> using namespace std; int sum(int x, int y) { return x + y; } int main() { cout << sum(1, 2) << endl; int (*pf)(int, int); // 未初始化 pf = sum; cout << pf(3, 4) << endl; /* output: 3 7 */ return 0; } 遇到

【c++ primer, 5e】类的其他特性

类成员再探 定义一个类型成员: #include <iostream> #include <string> using namespace std; class Screen { public: using pos = string::size_type; /* 这就是"类型成员",必须先定义后使用(p232) 等价声明: typedef string::size_type pos; string::size_type 一般是 unsigned int */ p

【C++ Primer | 10】再探迭代器

反向迭代器 1. 测试代码: 1 #include<iostream> 2 #include<vector> 3 #include<iterator> 4 using namespace std; 5 6 int main() 7 { 8 vector<int> vec = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 9 for (auto r_iter = vec.crbegin(); r_iter != vec.crend();

【C++ Primer 5th】Chapter 1

1. 每个C++都包含至少一个函数,其中一个必须为mian函数,且 main 函数的返回类型必须为 int. 2. 函数定义包括:返回类型,函数名,形参列表,函数体 3. main 函数返回值用来指示状态,0表示成功,其他值含义由系统定义,通常用来表示错误类型. 4. 通过 echo 命令可以获得 main 函数返回值.UNIX: echo $?   Windows : echo %ERRORLEVEL%. 5. 标准库有四个IO对象,cin,cout,cerr(警告错误.不缓冲),clog(一

【C++ Primer 笔记】(二) 变量

本系列文章由 Nick-Pem 原创编写,转载请说明出处. 作者:Nick-Pem 邮箱:[email protected] 留坑 原文地址:https://www.cnblogs.com/nickpem/p/8640413.html

【C++ Primer | 12】动态内存与智能指针

#ifndef MY_STRBLOB_H #define MY_STRBLOB_H #include<iostream> #include<vector> #include<memory> #include<initializer_list> using namespace std; class StrBlob { public: typedef vector<string>::size_type size_type; StrBlob(); St

【C++ Primer | 19】运行类型识别

type_info类 测试代码: 1 #include <iostream> 2 #include <typeinfo.h> 3 4 class Base { 5 public: 6 virtual void vvfunc() {} 7 }; 8 9 class Derived : public Base {}; 10 11 using namespace std; 12 int main() { 13 Derived* pd = new Derived; 14 Base* pb