类的基本思想是数据抽象和
封装。数据抽象是一种依赖于接口和实现分离的编程技术。一、定义抽象数据类型
1、 设计Sale_data类
a. 定义成员函数
如上图所示,成员函数体可以定义在类外,也可以定义在类内(isbn函数),isbn函数 如何获得bookNo成员所依赖的对象呢?
b. 引入this
调用isbn函数时,如:total.isbn(),当isbn返回bookNo时,实际上返回的是 total.bookNo。
成员函数通过一个名为this的额外的隐式参数来访问调用它的那个对象。
当调用total.isbn()时,则编译器将total的地址传递给隐式形参this。
isbn函数可以写为std::string isbn() const {return this->bookNo}
this是一个常量指针。
c. 引入const成员函数
isbn中另一个关键是,紧随参数列表后的const关键字,这里const 的作用是
修改隐式this指针的类型。默认情况下,this的类型是指向类类型的非常量的常量指针。即,在默认情况下我们不可以将this绑定到一个常量对象上。在isbn函数体内不会改变this所指的对象,所有将this 设置为指向常量的指针有助于提高函数的灵活性。因为this是指向常量的指针,所以常量成员函数不能改变调用它的对象的内容。
2、类的外部定义成员函数
avg_price函数便是定义在了Sale_data类的外部。
在类外部定义成员函数,①成员函数的定义必须与类内的声明一致。②外部定义的成员函数必须包含它所属的类名。
函数名Sale_data::avg_price使用了作用域运算符,因此当avg_price使用revenue 和units_sold时,实际上隐式的使用了Sale_data的成员。
3、 定义一个返回this对象的函数
当total.combine(trans)时,total 的地址绑定到this,trans的地址绑定到rhs。
当执行units_sold+=rhs.units_sold;语句时等同于:
求total.units_sold 和trans.units_sold的和,然后将结果保存到total.units_sold中。
Note:定义的函数类似于某个内置运算符时,应令该函数的行为尽量模仿这个运算符,内置的赋值运算符把它的左侧运算对象当作左值返回。
因为此时的左侧运算对象为Sale_data的对象,所以返回类型为Sale_data&。
return *this;返回total 的引用。
閱讀更多 編程語言學習 的文章