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 ...
随机推荐
- apache配置weblogic部署集群,多节点的项目和单节点项目并存 负载均衡
开启模块如下: LoadModule weblogic_module modules/mod_wl_22.so LoadModule lbmethod_byrequests_module module ...
- Java小陷阱
基本数据类型与字符串的连接 在Java中,+不仅可作为加法运算符使用,还可作为字符串连接运算符使用. 当把任何基本数据类型的值与字符串值进行连接运算时,基本类型的值将自动类型转换为字符串类型. pub ...
- mysql中的null字段值的处理及大小写问题
在MySQL中,NULL字段的处理,需要注意,当在处理查询条件中有NULL,很有可能你得到的值不是想要的,因为,在MySQL中,判断NULL值相等(=)或者不等(!=)都会返回false.主要出现在常 ...
- FullCalendar
一个非常完美的日期控件:https://fullcalendar.io/
- php Xdebug调试
php开发环境里,安装了xdebug模块后,var_dump()输出的结果将比较易于查看,但默认情况下,var_dump() 输出的结果将有所变化:过多的数组元素不再显示,字符串变量将只显示前N个字符 ...
- Erlang库 -- 有意思的库汇总
抄自这里 首先,库存在的目的大致可分为:1.提供便利2.尽可能解决一些痛点 首先,我们先明确一下Erlang编程语言的一些痛点(伪痛点):1,单进程问题Erlang虚拟机属于抢占式调度,抢占式调度有很 ...
- Perl 模块 Getopt::Std 和 Getopt::Long
示例程序: getopt.pl; 1 2 3 4 5 6 7 8 #!/usr/bin/perl -w #use strict; use Getopt::Std; use vars qw($opt_a ...
- iphone dev 入门实例5:Get the User Location & Address in iPhone App
Create the Project and Design the Interface First, create a new Xcode project using the Single View ...
- Cpk
CPK:Complex Process Capability index 的缩写,是现代企业用于表示制程能力的指标.制程能力是过程性能的允许最大变化范围与过程的正常偏差的比值.制程能力研究在於确认这些 ...
- jQuery插件:用于获取元素自身的HTML内容
jQuery.fn.outerHTML = function(s) { return (s) ? this.before(s).remove() : $("<Hill_man>& ...