c++ Primer(第五版) 课后题答案(七)

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 类所引用值








































猜你喜欢

转载自blog.csdn.net/u010830200/article/details/35801787