您的位置:首页 > 其它

7.1定义抽象数据类型

2016-05-23 23:42 387 查看
定义改进的Sale_data类

成员函数的声明必须在类的内部,它的定义则既可以在类的内部也可以类的外部。作为接口组成部分的成员函数,它们的声明和定义都在类的外部。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: