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 ...
随机推荐
- 转: Ext拖拽分析
整个Ext架构中组件是其重要的组成部分,除了少部分(如树的结点)的界面表现元素不是在这样的一个体系中,大部分的页面表现元素都被绑定在这个体系之中,下面从这个体系的最底层即在这个继承体系的最高层进行研究 ...
- Struts2 - 传值
Struts2传值有几种方式: 1)URL parameter 例如配置代码: <action name="login_*" class="com.my.actio ...
- THCircularProgressView.h 的使用方法
// // MainViewController.m // fitmiss // // Created by bill on 13-4-11. // Copyright (c) 2013年 lear. ...
- Javascript跨域问题解决方案
---本方法来自网上,因最近项目需求,解决了三天未果,最终发现此文并测试可用. 一个 非常优雅绝妙的解决方案!话不多说,直接上解决方案原理图: 该图要解决的问题说明如下:在AAA.com域名下的ind ...
- 遇到 Error creating the Web Proxy specified in the 'system.net/defaultProxy' configuration section的解决办法
用记事本编辑*.EXE.config,在“<system.net>”节点加入<defaultProxy> <proxy usesystemdefault="Fa ...
- hyper-v 中 安装 Centos 7.0 设置网络 教程
安装环境是: 系统:win server 2012 r2 DataCenter hyper-v版本:6.3.9600.16384 centos版本:7.0 从网上下载的 centos 7.0 如果找 ...
- 使用Cyclone IV控制DDR2
根据你的DDR2手册配置好megacore,megacore会生成一个example top: 在quartus中运行megacore生成的xxx_pin_assignments.tcl,指定DDR2 ...
- jquery form表单序列号
1.serialize()方法 格式:var data = $("form").serialize(); 功能:将表单内容序列化成一个字符串. 这样在ajax提交表单数据时,就不用 ...
- Puppet Agent/Master HTTPS Communications
The agent/master HTTP interface is REST-like, but varies from strictly RESTful design in several way ...
- SVN学习之svn命令行下的基本操作
http://huihai.iteye.com/blog/1985751 上一节已经把svn安装完成,下来就用命令行做一些简单的操作. 1.当svn安装完成后,svn管理人员会在svn的root根目录 ...