7.2
#ifndef SALESDATA_H
#define SALESDATA_H
#include<string>
struct Sales_data
{
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0;
Sales_data isbn()const {return this->bookNo};
Sales_data &combine(const Sales_data &);
};
#endif
7.3
Sales_data类
#ifndef SALESITEM_H
#define SALESITEM_H
#include<string>
struct Sales_data
{
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0;
std::string isbn() const { return bookNo; }
Sales_data& combine(const Sales_data&);
double avg_price() const;
};
double Sales_data::avg_price()const
{
return 0;
}
Sales_data& Sales_data::combine(const Sales_data &rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
inline std::istream &read(std::istream &in, Sales_data &s)
{
double price;
in >> s.bookNo >> s.units_sold >> price;
if (in)
s.revenue = s.units_sold *price;
else
s = Sales_data();
return in;
}
inline Sales_data add(const Sales_data&, const Sales_data&)
{
}
inline std::ostream &print(std::ostream& out, const Sales_data& s)
{
out << s.bookNo << " " << s.units_sold << " " << s.revenue << std::endl;
return out;
}
#endif // !SALESITEM_H</span>
源文件代码
#include<iostream>
#include "Sales_data.h"
using namespace std;
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.4
#ifndef PERSON_H
#define PERSON_H
#include <string>
struct Person
{
string per_name = 0;
string per_address = 0;
};
#endif
7.5
#ifndef PERSON_H
#define PERSON_H
#include <string>
struct Person
{
std::string per_name = 0;
std::string per_site = 0;
/*这些函数应该是const.
这些函数是"只读"函数,如果把不改变数据成员的函数
都加上 const 关键字进行标识,显然,可提高程序的可读性。
其实,它还能提高程序的可靠
性,已定义成 const 的成员函数,一旦企图修改数据成员的值,则编译器按错误处理*/
std::string name() const;
std::string site() const;
};
std::string Person::name() const
{
return this->per_name;
}
std::string Person::site() const
{
return this->per_site;
}
#endif
7.6
Sales_data add(const Sales_data &lhs, const Sales_data &rhs)
{
Sales_data sum = lhs;
sum.combine(lhs);
return sum;
}
std::istream &read(std::istream &is, Sales_data &item)
{
double price = 0;
is >> item.bookNo >> item.units_sold >> price;
item.revenue = item.units_sold * price;
return is;
}
std::ostream &print(std::ostream & os, const Sales_data &item)
{
os << item.bookNo << " " << item.units_sold << " " << item.revenue;
return os;
}
7.8
std::istream &read(std::istream &is, Sales_data &item);
std::ostream &print(std::ostream & os, const Sales_data &item);
为什么read函数将其Sales_data 参数定义成普通的引用,而print将其参数定义成常量引用?
答:read函数将其Sales_data 参数定义成普通的引用,是因为读取的流的内容将对Sales_data 参数所引用的类的值改变。
print将其参数定义成常量引用,是因为不改变Sales_data 类所引用值