类的基本思想是数据抽象和封装。
数据抽象是一种依赖于接口和实现分离的变成技术。
下面以 Sales_itme类和Sales_data类对抽象类型进行解释
#include
#include
using namespace std;
struct Sales_data
{
string isbn;
unsigned unit_solid = 0;
double revenue = 0.0;
Sales_data& read(istream& is) {
Sales_data sale_data;
cout << "please input the isbn:" << endl;
string s_isbn;
char *c_isbn=new char[sizeof(s_isbn)];
is.getline(c_isbn,sizeof(s_isbn));
s_isbn=c_isbn;
sale_data.isbn = s_isbn;
cout << "please input the unit_sold:" << endl;
char *c_unit_solid = new char[sizeof(c_unit_solid)];
is.getline(c_unit_solid, sizeof(s_isbn));
unsigned unit_solid = atoi(c_unit_solid);
sale_data.unit_solid = unit_solid;
cout << "please input the revenue:" << endl;
char *c_revenue = new char[sizeof(c_unit_solid)];
is.getline(c_unit_solid, sizeof(s_isbn));
double revenue = atof(c_unit_solid);
sale_data.revenue = revenue;
return sale_data;
}
void print(ostream os) {
}
};
简单写了个例子,感觉书本上面的例子有点复杂了
有类的抽象定义可以确定 Sales_data不是一个抽象数据类型,它允许类的用户直接访问他的数据成员,并且要求用户来编写操作。
把定义写在头文件中
struct Sales_data
{
//新成员:关于Sales_data对象的操作
string isbn() const {return bookNo;}
Sales_data& combine(const Sales_data&);
double avg_price() const;
}
//Sales_data的非成员接口函数
Sales_data add(const Sales_data&,const Sales_data&);
常量对象,以及常量对象的引用或指针都只能调用常量成员函数。
isstream &read(istream &is,Sales_data &item)
{
double price=0;
}
每个类都分别定义了他的对象初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数。
struct Sales_data
{
Sales_data()=default //默认构造函数
Sales_data(const string& isbn):bookNo(isbn){} //用isbn初始化bookNo
}
class Sales_data{
public: //添加了访问说明符
Sales_data()=default;
Sales_data(const string &isbn, unsigned units_sold, double revenue):bookNo(isbn),units_sold(units_sold),revenue(revenue*units_sold){}
Sales_data(const string &isbn):bookNo(isbn){}
string isbn() const {return bookNo;}
Sales_data &combine(const Sales_data&);
private: //添加了访问说明符
double avg_price() const {return units_sold?revenue/units_sold:0;}
string bookNo;
unsigned units_sold=0;
double revenue=0.0;
}
使用class和struct定义类唯一的区别就是默认的访问权限
类可以允许其他类或者函数访问他的非公有成员,方法是令其他类或者函数称为它的友元。
class Sales_data{
//为Sales_data的非成员函数所有的友元声明
friend Sales_data add(const Sales_data&,const Sales_data&);
friend istream &read(std::istream&,Sales_data&);
friend ostream &print(std::ostream&,const Sales_data&);
//其他成员及访问说明符与之前一致
public:
Sales_data()=default;
Sales_data(const std::string &isbn,unsigned unit_sold,double revenue):bookNo(isbn),unit_sold(unit_sold),revenue(revenue*unit_sold){}
private:
std::string bookNo;
unsigned unit_sold=0;
double revenue=0.0;
};
类的用法和struct用法一样,可以参考struct