#include<iostream>
//
//#ifndef Cccc//第一次包含本头文件时,#ifndef判断为真,预处理器将处理后面的内容直到#endif,此时的预处理变量Cccc已定义
//#define Cccc//第二次包含本头文件时,#ifndef判断为假,预处理器将忽略后面的内容,预处理变量一般定义为本头文件的大写形式
/*
....
*/
//#endif//只要简单的加上就好了,无视C++中的作用域规则
using namespace std;
class sales_data//the difference between class and struct is only class里面默认是private struct默认是 public
{
// friend 是非成员函数但可以调用类中的非公有成员
string bookno;
double units_sold;
double revenue;
public:
sales_data()=default; //默认构造函数
~sales_data();
string isbn(/*const sales_data*const this*/) const//这里const的作用:没有const的时候,this是一个sales_data*const ptr,
{ // but now it's a const sales_data*const,不能改变所指向地常量。
return bookno;//ISBN用bookno时相当于隐式地使用了this指向的成员 相当于 return this-> bookno
}
sales_data& combine(const sales_data rhs)//为了与内置地运算符保持一致,combine必须返回引用类型,因为左侧地运算对象为sales_data
{ //所以就返回sales_data的引用。 返回类型是sales_data &
this->units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
double avg_price() const
{
if (units_sold)
return revenue / units_sold;
else
return 0;
}
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;
}
sales_data add(const sales_data& lhs, const sales_data& rhs)
{
sales_data sum = lhs;
sum.combine(rhs);
return sum;
}
};
int main()
{
sales_data total;
if (total.read(cin, total))
{
sales_data trans;
while (trans.read(cin, trans))
{
if (total.isbn() == trans.isbn())
total.combine(trans);
else {
total.print(cout, total) << endl;
total = trans;
}
}
total.print(cout, total) << endl;
}
else
{
cerr << "NO, data?!" << endl;
}
}
c++primer 7,1,7,2笔记
最新推荐文章于 2024-08-22 23:21:41 发布