C++primer 练习15.26
定义Quote和Bulk_Quote的拷贝控制成员,令其与合成的版本行为一致。为这些成员以及其他构造函数添加打印状态的
语句,使得我们能够知道正在运行哪个程序。使用这些类编写程序,预测程序将创建和销毁哪些对象。重复实验,不断比较你
的预测和实际输出结果是否相同,直到预测完全准确再结束。
// 15_15.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include<iostream>
#include<string>
using namespace std; class Quote
{
public:
Quote() = default;
Quote(const string &book, double p) :bookNo(book), price(p) { cout << "Quote(const string&,double)" << endl; }
Quote(const Quote &);
Quote& operator=(const Quote &);
Quote(Quote &&)noexcept;
Quote& operator=(Quote &&)noexcept;
virtual ~Quote() { cout << "~Quote()" << endl; }
const string& isbn()const { return bookNo; }
virtual double net_price(size_t n)const
{
return n*price;
}
private:
string bookNo;
protected:
double price = 0.0;
}; Quote::Quote(const Quote &rhs)
{
cout << "Quote::Quote(const Quote &)" << endl;
bookNo = rhs.bookNo;
price = rhs.price;
} Quote& Quote::operator=(const Quote &rhs)
{
cout << "Quote::operator=(const Quote &)" << endl;
bookNo = rhs.bookNo;
price = rhs.price;
return *this;
} Quote::Quote(Quote &&rhs)noexcept
{
cout << "Quote::Quote(Quote &&)" << endl;
bookNo = move(rhs.bookNo);
price = move(rhs.price);
}
Quote& Quote::operator=(Quote &&rhs)noexcept
{
cout << "Quote::operator=(Quote &&)" << endl;
bookNo = move(rhs.bookNo);
price = move(rhs.price);
return *this;
} class Dis_Quote :public Quote
{
public:
Dis_Quote() = default;
Dis_Quote(const string &book,double p,size_t n,double d):Quote(book,p),quantity(n),discount(d){
cout << "Dis_Quote(const string&,double,size_t,double)" << endl;
}
Dis_Quote(const Dis_Quote &);
Dis_Quote& operator=(const Dis_Quote &);
Dis_Quote(Dis_Quote &&)noexcept;
Dis_Quote& operator= (Dis_Quote &&)noexcept;
virtual ~Dis_Quote()override
{
cout << "~Dis_Quote()" << endl;
}
virtual double net_price(size_t n)const = ;
protected:
size_t quantity = ;
double discount = 0.0;
}; Dis_Quote::Dis_Quote(const Dis_Quote &rhs):Quote(rhs)
{
cout << "Dis_Quote::Dis_Quote(const Dis_Quote &)" << endl;
quantity = rhs.quantity;
discount = rhs.discount;
} Dis_Quote& Dis_Quote::operator=(const Dis_Quote &rhs)
{
Quote::operator=(rhs);
cout << "Dis_Quote::operator=(const Dis_Quote &)" << endl;
quantity = rhs.quantity;
discount = rhs.discount;
return *this;
} Dis_Quote::Dis_Quote(Dis_Quote &&rhs)noexcept :Quote(move(rhs))
{
cout << "Dis_Quote::Dis_quote(Dis_Quote &&)" << endl;
quantity = move(rhs.quantity);
discount = move(rhs.discount);
} Dis_Quote& Dis_Quote::operator=(Dis_Quote &&rhs)noexcept
{
Quote::operator=(move(rhs));
cout << "Dis_Quote::operator=(Dis_Quote &&)" << endl;
quantity = move(rhs.quantity);
discount = move(rhs.discount);
return *this;
} class Bulk_Quote :public Dis_Quote
{
public:
Bulk_Quote() = default;
Bulk_Quote(const string &book,double p,size_t n,double d):Dis_Quote(book,p,n,d){
cout << "Bulk_Quote(const string &,double,size_t,double)" << endl;
}
Bulk_Quote(const Bulk_Quote &);
Bulk_Quote& operator=(const Bulk_Quote &);
Bulk_Quote(Bulk_Quote &&)noexcept;
Bulk_Quote& operator=(Bulk_Quote &&)noexcept;
virtual ~Bulk_Quote()override
{
cout << "~Bulk_Quote()" << endl;
}
virtual double net_price(size_t n)const override
{
if (n > quantity)
return n*( - discount)*price;
else
return n*price;
}
}; Bulk_Quote::Bulk_Quote(const Bulk_Quote &rhs):Dis_Quote(rhs)
{
cout << "Bulk_Quote::Bulk_Quote(const Bulk_Quote&)" << endl; } Bulk_Quote& Bulk_Quote::operator=(const Bulk_Quote &rhs)
{
Dis_Quote::operator=(rhs);
cout << "Dis_Quote& operator=(const Dis_Quote &);" << endl;
return *this;
} Bulk_Quote::Bulk_Quote(Bulk_Quote &&rhs)noexcept :Dis_Quote(move(rhs))
{
cout << "Bulk_Quote::Bulk_Quote(Bulk_Quote &&)" << endl;
} Bulk_Quote& Bulk_Quote::operator=(Bulk_Quote &&rhs)noexcept
{
Dis_Quote::operator=(move(rhs));
cout << "Bulk_Quote::operator=(Bulk_Quote &&)" << endl;
return *this;
} class Exercise_Quote :public Dis_Quote
{
public:
Exercise_Quote() = default;
Exercise_Quote(const string &book,double p,size_t n,double d):Dis_Quote(book,p,n,d){}
virtual double net_price(size_t n)const override
{
if (n <= quantity)
return n*( - discount)*price;
else
return quantity*( - discount)*price + (n - quantity)*price;
}
}; double print_total(ostream &os, const Quote &item, size_t n)
{
double ret = item.net_price(n);
os << "ISBN: " << item.isbn() <<
" # sold: " << n << " total due: " << ret << endl;
return ret;
} int main()
{ //Quote q1("lidandan", 5);
//Bulk_Quote q2("lidandan", 5, 9, 0.1);
//Exercise_Quote q3("lidandan", 5, 9, 0.1);
////Dis_Quote q4;
//print_total(cout, q1, 10);
//print_total(cout, q2, 10);
//print_total(cout, q3, 10); Bulk_Quote q1("test", , , 0.1);
Bulk_Quote q2=move(q1);
q2 = { "test",,,0.1 };
return ;
}
C++primer 练习15.26的更多相关文章
- [C++ Primer] : 第15章: 面向对象程序设计
OOP: 概述 面向对象程序设计的核心思想是数据抽象, 继承和动态绑定. 通过数据抽象, 我们可以实现类的接口与实现的分离; 使用继承, 可以定义相似的类型并对其相似关系建模; 使用动态绑定, 可以在 ...
- C++primer 练习15.15
// 15_15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- c++ primer第15章这几个例子中的构造函数形式不太理解
//向基类构造函数传递实参p491 class Bulk_item : public Item_base{ public: Bulk_item(,double disc_rate = 0.0): It ...
- 【C++ Primer 第15章】定义派生类析构函数
学习资料 • 基类和派生类析构函数执行顺序 定义派生类析构函数 [注意]定义一个对象时先调用基类的构造函数.然后调用派生类的构造函数:析构的时候恰好相反:先调用派生类的析构函数.然后调用基类的析构函数 ...
- 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符
学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...
- 【【C++ Primer 第15章】 虚析构函数
学习资料 • C++中基类的析构函数为什么要用virtual虚析构函数 虚析构函数 1. 正文 直接的讲,C++中基类采用virtual虚析构函数是为了防止内存泄漏.具体地说,如果派生类中申请了内存空 ...
- 第15.26节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QListWidget详解
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 列表部件(List Widget)对应类QListWidget,是从QListView派生 ...
- JavaSE_ 集合框架 总目录(15~18)
JavaSE学习总结第15天_集合框架1 15.01 对象数组的概述和使用15.02 对象数组的内存图解15.03 集合的由来及与数组的区别15.04 集合的继承体系图解15.05 Collectio ...
- JavaSE学习总结第15天_集合框架1
15.01 对象数组的概述和使用 public class Student { // 成员变量 private String name; private int age; // 构造方法 publ ...
随机推荐
- 《中日韩联合开发 - Asianux Server 3》(Asianux Server 3.0)[ISO]
中文名: 中日韩联合开发 - Asianux Server 3英文名: Asianux Server 3.0资源格式: 光盘镜像发行时间: 2007年制作发行: 红旗软件(中国)MiracleLinu ...
- Maven相关: An internal error occurred during: "Updating Maven Project". java.lang.NullPointerException
I solved mine by delete the .settings folder and .project file in the project and then reimport the ...
- eclipse修改工程名
直接修改工程可能会产生一些莫名其妙的问题,需遵循以下三步: 1. 右键工程:Refactor->Rename,或选中工程按F2,修改名称 2. 右键工程:Properties->Web P ...
- HackerRank "The Indian Job"
A sly knapsack problem in disguise! Thanks to https://github.com/bhajunsingh/programming-challanges/ ...
- bzoj4316: 小C的独立集
Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使 ...
- Add LUN to ASM in Linux
# Create new LUN for Linux in the AMS2100 # echo "- - -" >/sys/class/scsi_host/host3/sc ...
- activiti自定义流程之Spring整合activiti-modeler5.16实例(九):历史任务查询
注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 (2)创建流程模型:activiti自定义流程之Spring ...
- opacity兼容写法
.opacity{ position: absolute; top: 0px;left: 0px; background: #000; filter:alpha(opacity=50); /* IE ...
- 黄聪:chrome扩展开发《AJAX请求》
chrome在一次更新之后,出于安全考虑,完全的禁止了content_script从https向http发起ajax请求,即使正常情况下也会在console里给出提示.这对于WEB来讲是好事,但对于扩 ...
- 黄聪:Mysql数据库还原备份提示MySQL server has gone away 的解决方法(备份文件数据过大)
使用mysql做数据库还原的时候,由于有些数据很大,会出现这样的错误:The MySQL Server returned this Error:MySQL Error Nr. MySQL server ...