7.1定义抽象数据类型
2016-05-23 23:42
387 查看
定义改进的Sale_data类
成员函数的声明必须在类的内部,它的定义则既可以在类的内部也可以类的外部。作为接口组成部分的成员函数,它们的声明和定义都在类的外部。
成员函数的声明必须在类的内部,它的定义既可以在类的内部也可以在类的外部;作为接口的非成员函数,它们的定义和声明都在类的外部。
//常量成员函数
std::string isbn() const {return bookNo;}
定义成员函数
尽管所有成员函数都必须在类的内部声明,但是成员函数可以定义在类外。
例如:
Std::string isbn() const {return this->bookNo;}
引入this
![](http://img.blog.csdn.net/20160523235203972)
![](http://img.blog.csdn.net/20160523235259195)
引入const成员函数:
在默认情况下,this的类型是指向类类型非常量版本的常量指针。例如在Sales_item成员中,this的类型是Sales_item *const。这样我们就不能把this绑定到一个常量对象上。这情况使我们不能再一个常量对象上调用普通的成员函数。如果isbn是一个普通函数并且this是一个普通的指针参数,则我们应该把this声明成const Sales_item *const。C++语法中允许const关键字放在成员函数的参数列表之后。参数后面的const表示this是一个指向常量的指针。
在类的外部定义成员函数:
当我们在类的外部定义成员函数时,成员函数的定义必须与它声明匹配。也就是说,返回类型,参数列表和函数名都得与类内部的声明保持一致。如果成员函数被声明为常量成员函数,那么它的定义也必须在参数列表后明确指定const属性。类外部定义的成员的名字必须包含它所属的类名:
定义一个返回this对象的函数:
![](http://img.blog.csdn.net/20160523235440928)
![](http://img.blog.csdn.net/20160523235514944)
![](http://img.blog.csdn.net/20160523235533055)
定义类相关的非成员函数:
成员函数的声明必须在类的内部,它的定义则既可以在类的内部也可以类的外部。作为接口组成部分的成员函数,它们的声明和定义都在类的外部。
struct Sales_data { std::string isbn() const {return bookNo;} Sales_data& combine(const Sales_data&); double avg_price() const; std::string bookNo; unsigned units_sold=0; double revenue=0.0; }; //Sales_data的非成员接口函数 Sales_data add(const Sales_data&, const Sales_data&); std::ostream &print(std::ostream&, const Sales_data&); std::istream &read(std::istream, Sales_data&);
成员函数的声明必须在类的内部,它的定义既可以在类的内部也可以在类的外部;作为接口的非成员函数,它们的定义和声明都在类的外部。
//常量成员函数
std::string isbn() const {return bookNo;}
定义成员函数
尽管所有成员函数都必须在类的内部声明,但是成员函数可以定义在类外。
例如:
Std::string isbn() const {return this->bookNo;}
引入this
#include <iostream> #include <string> using namespace std; struct Sales_data { std::string isbn() const { return this->bookNo; } Sales_data& combine(const Sales_data&); double avg_price() const; std::string bookNo = "1111"; unsigned units_sold = 0; double revenue = 0.0; }; //Sales_data的非成员接口函数 Sales_data add(const Sales_data&, const Sales_data&); std::ostream &print(std::ostream&, const Sales_data&); std::istream &read(std::istream, Sales_data&); int main() { Sales_data total; total.isbn(); return 0; }
引入const成员函数:
在默认情况下,this的类型是指向类类型非常量版本的常量指针。例如在Sales_item成员中,this的类型是Sales_item *const。这样我们就不能把this绑定到一个常量对象上。这情况使我们不能再一个常量对象上调用普通的成员函数。如果isbn是一个普通函数并且this是一个普通的指针参数,则我们应该把this声明成const Sales_item *const。C++语法中允许const关键字放在成员函数的参数列表之后。参数后面的const表示this是一个指向常量的指针。
在类的外部定义成员函数:
当我们在类的外部定义成员函数时,成员函数的定义必须与它声明匹配。也就是说,返回类型,参数列表和函数名都得与类内部的声明保持一致。如果成员函数被声明为常量成员函数,那么它的定义也必须在参数列表后明确指定const属性。类外部定义的成员的名字必须包含它所属的类名:
double Sales_data::avg_price() const { if(units_sold) return revenue/units_sold; else return 0; }
定义一个返回this对象的函数:
定义类相关的非成员函数:
#include <iostream> #include <string> using namespace std; class Sales_data { friend Sales_data add(const Sales_data &lhs, const Sales_data &rhs); friend std::ostream &print(std::ostream &os, const Sales_data &item); friend std::istream &read(std::istream &is, Sales_data &item); public: std::string isbn()const{ return bookNo; } double avg_price()const; Sales_data& combine(const Sales_data &rhs) { units_sold += rhs.units_sold;//累加书籍的销售量 saleprice = (rhs.saleprice*rhs.units_sold + saleprice*units_sold) / (rhs.units_sold + units_sold);//重新计算实际销售价格 if (sellingprice != 0) discount = saleprice / sellingprice;//重新计算实际折扣 return *this;//返回合并后的结果 } private: std::string bookNo;//书籍编号 unsigned units_sold = 0;//销售量 double sellingprice = 0.0;//原始价格 double saleprice = 0.0;//实售价格 double discount = 0.0;//折扣 double revenue = 0.0; }; //在类的外部定义成员函数 double Sales_data::avg_price()const { if (units_sold) return revenue / units_sold; } //Sales_data的非成员接口函数 Sales_data add(const Sales_data &lhs, const Sales_data &rhs) { Sales_data sum = lhs; sum.combine(rhs); return sum; } std::ostream &print(std::ostream &os, const Sales_data &item) { os << item.isbn() << " " << item.units_sold << " " << item.sellingprice << " " << item.saleprice << " " << item.discount; return os; } std::istream &read(std::istream &is, Sales_data &item) { is >> item.bookNo >> item.units_sold >> item.sellingprice >> item.saleprice; return is; } int main() { return 0; }
相关文章推荐
- HTTP Authorization
- 查看htmlView
- 涨停股票形态系列 一
- Runner站立会议之个人会议(冲刺二)
- 网络安全实验室基础关 writeup
- 经典文章集合
- Android-architecture之MVC、MVP、MVVM、Data-Binding
- 使用Maven构建多模块项目
- c++作业6
- C++实验6--矩阵求和
- 退烧药
- 类的继承
- 1--信息系统监理师知识框架图-(IS2-160523p)
- 指针操作数组的两种方式
- Android RxJava使用介绍(一)概念
- Windows10报错:无法使用内置管理员帐户打开Microsoft Edge解决方法
- android studio 2.0 导入工程
- 30分钟正则表达式
- python 练习 2
- android中的各类权限