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 ...
随机推荐
- ORACLE 重置SEQQUENCE
select seq.nextval from dual; --假设值是30 alter sequence seq increment by -30; select seq.nextval from ...
- Android内核剖析读书笔记
第16章 程序包管理 PackageManagerService類 PmS 目錄 16.1 包管理概述 16.2 packages.xml文件格式 16.3 包管理服務的啟動過程 16.4 應用程序的 ...
- Panel扩展 圆角边框,弧形边框
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; u ...
- 【Hadoop环境搭建】Centos6.8搭建hadoop伪分布模式
阅读目录 ~/.ssh/authorized_keys 把公钥加到用于认证的公钥文件中,authorized_keys是用于认证的公钥文件 方式2: (未测试,应该可用) 基于空口令创建新的SSH密钥 ...
- Window下Nexus私服搭建
项目组大部分人员不能访问maven的central repository,因此在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到这台私服上 环境是:nexus-2.1.1.mav ...
- KindEditor得不到textarea值的解决方法----摘至天涯
以前有朋友遇到过这个问题,就是KindEditor在火狐下或者其他浏览器下都无法得到textarea文本框的值,点击表单提交按钮得到的是空白.昨天天涯PHP博客[http://blog.phpha.c ...
- android学习笔记33——资源ShapeDrawable
ShapeDrawable ShapeDrawable用于定义一个基本的几何图像(如,矩形.圆形.线条.......). 定义ShapeDrawable的XML文件的根元素是<shape.../ ...
- Linux大文件传输(转)
我们经常需要在机器之间传输文件.比如备份,复制数据等等.这个是很常见,也是很简单的.用scp或者rsync就能很好的完成任务.但是如果文件很大,需要占用一些传输时间的时候,怎样又快又好地完成任务就很重 ...
- 3. c的输入输出
putchar与getchar操作输入输出通道 #include <stdio.h> #include <ctype.h> main(){ int c; while((c = ...
- 一. JVM发展史,运行时数据区域,四大引用
一.JVM的出现 JVM将字节码解释成不同os下的机器指令,有了jvm,java语言在不同平台上运行时不需要重新编译 虚拟机发展史 (1)Sun Classic classic jvm要么采用纯解释器 ...