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 ...
随机推荐
- JavaScript兼容性问题
Firefox浏览器不支持js的innerText属性:
- 记一次系统稳定性问题的分析处理过程(因CallContext使用不当而造成bug)
问题描述: 一个项目现场反馈,“差旅费类型的单据审批,在出现业务规则没满足的情况时(即业务报错,需要人机交互),审批仍然通过了”.从技术的角度上说,就是业务构件中的业务规则报错后,事务没有回滚.但是, ...
- bzoj4705: 棋盘游戏
Description 有一个N*M的棋盘,初始每个格子都是白色的. 行操作是指选定某一行,将这行所有格子的颜色取反(黑白互换). 列操作是指选定某一列,将这列所有格子的颜色取反. XX进行了R次行操 ...
- Mac下关于——你不能拷贝项目“”,因为它的名称太长或包括的字符在目的宗卷上无效。文件的删除
内容是google的,测试有效,因为用revel打包的东西删除以后有这个循环bug Mac下关于——你不能拷贝项目“”,因为它的名称太长或包括的字符在目的宗卷上无效.文件的删除 关于这个问题我找到的一 ...
- 减小Gcc编译程序的体积
众所周知,Gcc编译的原始程序一般很大,其实有几种方法能大大减小目标代码的体积,一般有以下几种方法. 基本知识来源:http://www.mingw.org/wiki/Large_executable ...
- Android三-AsyncTask
基础介绍:http://blog.csdn.net/liuhe688/article/details/6532519 扩展知识:http://blog.csdn.net/pipisky2006/art ...
- Oracle-单表合并列
表基本结构 合并列 select t.student,decode(t.java,'','','java') 科目, t.java from student t union select t.stud ...
- 一探前端开发中的JS调试技巧
前言 调试技巧,在任何一项技术研发中都可谓是必不可少的技能.掌握各种调试技巧,必定能在工作中起到事半功倍的效果.譬如,快速定位问题.降低故障概率.帮助分析逻辑错误等等.而在互联网前端开发越来越重要的今 ...
- CE_现金银行对账单的手工导入和调节(案例)
2014-07-14 Created By BaoXinjian
- LPC1768之中断
一外中断:只有特定的4个外中断引脚, 1 在特定的引脚上,引脚功能要选对应的外中断功能 2设定的触发条件(高低电平.上升/下降沿) 3 NVIC设定,特定的通道. 二GPIO中断: 1只有GPIO0和 ...