【C++ Primer 第7章】定义抽象数据类型
参考资料
Sales_data类
Sales_data.h
#include<iostream>
#include<string> class Sales_data
{
friend std::istream& operator >> (std::istream&, Sales_data&);
friend std::ostream& operator << (std::ostream&, Sales_data&);
friend Sales_data operator + (const Sales_data&, const Sales_data&);
friend bool operator == (const Sales_data&, const Sales_data&)
public:
Sales_data() = default;
Sales_data(std::string s): bookNo(s), units_sold(), revenue(0.0) {}
Sales_data(std::string s, unsigned n, double p): bookNo(s), units_sold(n), revenue(p) {}
public:
string isbn() const { return bookNo; }
Sales_data& operator += (const Sales_data&);
private:
string bookNo; //书籍编号
double units_sold = ; //销售量
double sellingprice = 0.0; //原始价格
double salesprice = 0.0; //实售价格
double discount = 0.0; //折扣量
};
Sales_data.cpp
#include"Sales_data.h"
#include<iostream>
#include<string> bool Sales_data::operator == (const Sales_data &lhs, const Sales_data &rhs)
{
return lhs.units_sold == rhs.units_sold &&
lhs.sellprice == rhs.sellprice &&
lhs.salesprice == rhs.salesprice &&
lhs.isbn() == rhs.isbn();
} Sales_data Sales_data::operator + (const Sales_data &lhs, const Sales_data &rhs)
{
Sales_data ret(lhs);
ret += rhs;
return ret;
} Sales_data& Sales_data::operator += (const Sales_data &rhs)
{
units_sold += rhs.units_sold;
salesprice = (units_sold * salesprice + rhs.units_sold * rhs.salesprice)
/ (units_sold + rhs.units_sold);
if(sellprice != )
discount = salesprice / sellprice;
return *this;
} istream& Sales_data::operator >> (std::istream &in, Sales_data &s)
{
in >> s.bookNo >> s.sellprice >> s.salesprice;
if(in && s.sellingprice != )
s.discount = s.salesprice / s.sellprice;
else
s = Sales_data();
} ostream& Sales_data::operator << (std::ostream &os, const Sales_data &s)
{
os << s.isbn() << " " << s.units_sold << " " << s.sellprice << " "
<< s.salesprice << " " << s.discount;
return os;
}
构造函数
功能:初始化类对象的数据成员。无论何时只要类的对象被创建,就会执行构造函数。
特点:构造函数的名字和类的名字相同。类可以包含有多个构造函数(类似重载函数)。不同于其他成员函数,构造函数不能被声明为const,且没有返回类型。
默认构造函数:无需任何实参,执行默认初始化。
合成默认构造函数:编译器创建的构造函数
• 只有当类没有声明任何构造函数时,编译器才会自动隐式地定义一个默认构造函数。
• 如果类包含有内置类型或复合类型的成员,则只有当这些成员全部都被赋予了类的初始值,这个类才适合于使用合成的默认构造函数。
【C++ Primer 第7章】定义抽象数据类型的更多相关文章
- <<C++ Primer>> 第 7 章 类
术语表 第 7 章 类 抽象数据类型(abstract data type): 封装(隐藏)了实现细节的数据结构. 访问说明符(access specifier): 包括关键字 public 和 ...
- [C++ Primer] 第7章: 类
定义抽象数据类型 定义在类内部的函数是隐式的inline函数. const成员函数 又叫做常量成员函数, 成员函数参数列表之后紧跟const关键字, const修饰的是类this指针. 默认情况下th ...
- C++ Primer Plus 第一章 预备知识
C++ Primer Plus 第一章 预备知识 知识点梳理 本章主要讲述了C++的由来,讨论了面向过程语言与面向对象语言的区别,介绍了ANSI/ISO制定的C++标准,阐述了在Windows.Mac ...
- 第二章 深入 C# 数据类型
第二章 深入 C# 数据类型 1.封装又称信息隐藏,是指利用抽象数据类型将数据和数据的操作结合在一起,使其构成一个不可分割的独立实体,尽可能的隐藏内部的细节,只保留一些对外接口,使之于外部发生联系. ...
- C++primer第三章标准库类型
除第二章介绍的基本数据类型外,C++ 还定义了一个内容丰富的抽象数据类型标准库. 本章将介绍标准库中的 vector.string 和 bitset 类型. string 类型支持长度可变的字符串 v ...
- C++ Primer 第2章 变量和基本类型
C++ Primer 第2章 变量和基本类型 C Primer 第2章 变量和基本类型 1 基本内置类型 算数类型 类型转换 字面值常量 2 变量 变量定义 3 复合类型 引用d左引用 指针d 4 c ...
- 逆向基础 C++ Primer Plus 第二章 开始学习C++
C++ Primer Plus 第二章 开始学习C++ 知识点梳理 本章从一个简单的C++例子出发,主要介绍了创建C++程序的步骤,以及其所包含的预处理器编译指令.函数头.编译指令.函数体.注释等组成 ...
- 抽象数据类型ADT
ADT(Abstract Data Type) 类型由什么组成? 一个类型(type)指定两类信息,一个属性集和一个操作集. 假设要定义一个新的数据类型.首先,要提供存储数据的方式,可能是通过设计一个 ...
- C语言泛型编程--抽象数据类型
一.数据类型: 在任何编程语言中,数据类型作为一个整体,ANSI-C包含的类型为:int.double.char……,程序员很少满意语言本身提供的数据类型,一个简单的办法就是构造类似:array.st ...
随机推荐
- 文件上传---form表单,ajax,jquery,以及iframe无刷新上传 (processData,contentType讲解)
服务端程序: import tornado.web import os IMG_LIST=[] class IndexHandler(tornado.web.RequestHandler): def ...
- 学习windows编程 day3 之 自定义画笔的两种方法
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRU ...
- dubbo注册服务和消费服务---入门篇
本文介绍如何用dubbo+zk来实现一个注册服务 + 消费服务的入门小demo 需要环境:zk服务器 两个maven项目,一个负责提供服务,一个负责消费服务. dubbo-service 服务端 po ...
- Eclipse Groovy插件使用时出现的错误 org.eclipse.core.runtime.InvalidRegistryObjectException: Invalid registry object
在eclipse marketplace中下载了groovy插件,发现使用的groovy版本跟项目中使用的groovy版本不一致. 于是在Preferences -> Groovy -> ...
- 10-SQL Server 2008 R2安装步骤
一. 软件和环境 1. 软件 : SQL Server 2008 R2 企业版 软件下载地址:XXXX 2. 环境要求: .Net FrameWork 3.5 以上 (windows 7 ...
- C# PointToScreen
子窗体定位时,如果主窗口不在左上角,需要根据主窗口的坐标,相减才行. Point p1 = Label.PointToScreen(new Point(0, 0)); p1.X -= this.X; ...
- 16. Spring boot 错误页面
默认效果:1).浏览器,返回一个默认的错误页面 1.1 请求头 1.2返回结果 2).如果是其他客户端,默认响应一个json数据 2.1请求头 2.2返回结果 { "timestamp& ...
- Tomcat环境变量,端口号,编码格式,项目路径,默认页的配置
Tomcat的配置 1.配置环境变量 新建名为:CATALINA_HOME的系统变量,值为我们安装tomcat的目录 2端口号及编码的配置: 找到tomcat安装目录下的sonf下的server文件, ...
- 向GitHub上上传代码(转)
使用git将项目上传到github(最简单方法) 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下 ...
- OpenCV入门(1)- 简介
1.图像的表示 在计算机看来,图像只是一些亮度各异的点,一副M*N的图片可以用M*N的矩阵来表示,矩阵的值表示这个位置上像素的亮度. 一般灰度图用二维矩阵来表示,彩色(多通道)图用三维矩阵表示,大部分 ...