程序清单10.1+10.2+10.3

头文件stock.h
#ifndef STOCK00_H_    //先测试x是否被宏定义过
#define STOCK00_H_ //如果没有宏定义,就宏定义x并编译下面的语句 #include <string>
class Stock //类声明
{
private:
std::string company;
long shares;
double share_val;
double total_val;
void set_tot() { total_val=shares*share_val; }
public:
void acquire(const std::string &co,long n,double pr);
void buy(long num,double price);
void sell(long num,double price);
void update(double price);
void show();
}; //千万别忘了分号 #endif //如果已经定义了则编译#endif后面的语句

stock.cpp

#include<iostream>
#include "stock.h" void Stock::acquire(const std::string &co,long n,double pr){
company=co;
if(n<){
std::cout<<company<<std::endl;
shares=;
}else
shares=n;
share_val=pr;
set_tot();
} void Stock::buy(long num,double price){
if(num<)
std::cout<<"Error!\n";
else{
shares+=num;
share_val=price;
set_tot();
}
} void Stock::sell(long num,double price){
using std::cout;
if(num<)
cout<<"Error!\n";
else if(num>shares)
cout<<"You can not sell more than you have!\n";
else{
shares-=num;
share_val=price;
set_tot();
}
} void Stock::update(double price){
share_val=price;
set_tot();
} void Stock::show(){
std::cout<<"Company: "<<company<<", Shares:"<<shares<<"\nShare Price: $"<<share_val<<", Total Worth: $"<<total_val<<'\n';
}

main.cpp

//用于测试Stock类的设计
#include<iostream>
#include "stock.h" void main(){
Stock cat;
cat.acquire("NanoSmart",,12.50);
cat.show();
cat.buy(,18.125);
cat.show();
cat.sell(,20.0);
cat.show();
cat.buy(,40.125);
cat.show();
cat.sell(,0.125);
cat.show();
system("pause");
}

修改stock.cpp文件中的show方法,使其数字格式统一

void Stock::show(){
using std::cout;
using std::ios_base;
ios_base::fmtflags orig=cout.setf(ios_base::fixed,ios_base::floatfield);//设置cout对象的一个标记,命令cout使用定点表示法
std::streamsize prec=cout.precision();//cout使用定点表示法时,显示三位小数 cout<<"Company: "<<company<<", Shares:"<<shares<<"\nShare Price: $"<<share_val<<", Total Worth: $"<<total_val<<'\n';
cout.setf(orig,ios_base::floatfield);
cout.precision(prec);
}

小结

构造函数和析构函数

程序清单10.4+10.5+10.6

头文件

#ifndef STOCK10_H_    //先测试x是否被宏定义过
#define STOCK10_H_ //如果没有宏定义,就宏定义x并编译下面的语句
#include <string> class Stock //类声明
{
private:
std::string company;
long shares;
double share_val;
double total_val;
void set_tot() { total_val=shares*share_val; }
public:
Stock(); //默认构造函数
Stock(const std::string &co,long n=,double pr=0.0);
~Stock(); //析构函数
void buy(long num,double price);
void sell(long num,double price);
void update(double price);
void show();
}; //千万别忘了分号 #endif //如果已经定义了则编译#endif后面的语句

函数定义

#include<iostream>
#include "stock.h"
using namespace std; //构造函数
Stock::Stock(){
cout<<"Default constructor called\n";
company="no name";
shares=;
share_val=0.0;
total_val=0.0;
}
Stock::Stock(const std::string &co,long n,double pr){
cout<<"Constructor using "<<co<<" called\n";
company=co;
if(n<){
cout<<company<<endl;
shares=;
}else
shares=n;
share_val=pr;
set_tot();
}
//类的析构函数
Stock::~Stock(){
cout<<"Bye, "<<company<<endl;
} void Stock::buy(long num,double price){
if(num<)
std::cout<<"Error!\n";
else{
shares+=num;
share_val=price;
set_tot();
}
} void Stock::sell(long num,double price){
if(num<)
cout<<"Error!\n";
else if(num>shares)
cout<<"You can not sell more than you have!\n";
else{
shares-=num;
share_val=price;
set_tot();
}
} void Stock::update(double price){
share_val=price;
set_tot();
} void Stock::show(){
ios_base::fmtflags orig=cout.setf(ios_base::fixed,ios_base::floatfield);//设置cout对象的一个标记,命令cout使用定点表示法
streamsize prec=cout.precision();//cout使用定点表示法时,显示三位小数
cout<<"Company: "<<company<<", Shares:"<<shares<<"\nShare Price: $"<<share_val;
cout.precision();//显示2位小数
cout<<", Total Worth: $"<<total_val<<endl;
cout.setf(orig,ios_base::floatfield);
cout.precision(prec);
}

主函数

#include<iostream>
#include "stock.h" void main(){
{
using std::cout;
cout<<"Using constructors to create new objects!!!\n";
Stock stock1("NanoSmart",,20.0);
stock1.show();
Stock stock2=Stock ("Boffo Object",,2.0);
stock2.show(); cout<<"Assigning stock1 to stock2!!!\n";
stock2=stock1;
cout<<"Listing stock1 and stock2:\n";
stock1.show();
stock2.show(); cout<<"Using a constructor to reset an object!!!\n";
stock1=Stock("Nifty Foods",,50.0);
cout<<"Revised stock1:\n";
stock1.show();
cout<<"Done\n";
}//代码执行到此处后,调用析构函数。若没有这对括号,程序将在代码退出时调用(即我们无法观察到析构函数的调用)
system("pause");
}

最后两行输出是析构函数调用的结果。

栈先进后出

辨析三个const

如声明  const int func(const int & a) const

第一个表示返回值是个int型的常值
第二个代表const int的引用,a可读不可改
第三个代表这个函数类中的成员变量,不可修改

const Stock & topval(const Stock &s) const;//返回const Stock类型的引用:参数是引用,返回值也是引用

程序清单10.7+10.8+10.9(this)

#ifndef STOCK
#define STOCK
#include <string> class Stock //类声明
{
private:
std::string company;
long shares;
double share_val;
double total_val;
void set_tot() { total_val=shares*share_val; }
public:
Stock(); //默认构造函数
Stock(const std::string &co,long n=,double pr=0.0);
~Stock(); //析构函数
void buy(long num,double price);
void sell(long num,double price);
void update(double price);
void show() const; //const在后面表示不可修改函数内部的值
const Stock & topval(const Stock &s) const;//返回const Stock类型的引用:参数是引用,返回值也是引用
}; //千万别忘了分号 #endif
#include<iostream>
#include "stock.h"
using namespace std; //构造函数
Stock::Stock(){
company="no name";
shares=;
share_val=0.0;
total_val=0.0;
}
Stock::Stock(const std::string &co,long n,double pr){
company=co;
if(n<){
cout<<company<<endl;
shares=;
}else
shares=n;
share_val=pr;
set_tot();
}
//类的析构函数
Stock::~Stock(){
} void Stock::buy(long num,double price){
if(num<)
std::cout<<"Error!\n";
else{
shares+=num;
share_val=price;
set_tot();
}
} void Stock::sell(long num,double price){
if(num<)
cout<<"Error!\n";
else if(num>shares)
cout<<"You can not sell more than you have!\n";
else{
shares-=num;
share_val=price;
set_tot();
}
} void Stock::update(double price){
share_val=price;
set_tot();
} void Stock::show() const{
ios_base::fmtflags orig=cout.setf(ios_base::fixed,ios_base::floatfield);//设置cout对象的一个标记,命令cout使用定点表示法
streamsize prec=cout.precision();//cout使用定点表示法时,显示三位小数
cout<<"Company: "<<company<<", Shares:"<<shares<<"\n Share Price: $"<<share_val;
cout.precision();//显示2位小数
cout<<", Total Worth: $"<<total_val<<endl;
cout.setf(orig,ios_base::floatfield);
cout.precision(prec);
} const Stock & Stock::topval(const Stock &s) const{
if(s.total_val>total_val)
return s;
else
return *this;
}
#include<iostream>
#include "stock.h" const int STKS=;
void main(){
Stock stocks[STKS]={
Stock("Nano",,20.0),
Stock("Boffo",,2.0),
Stock("Mono",,3.25),
Stock("Fleep",,6.5),
};
std::cout<<"Stock holdings:\n";
int st;
for (st = ; st < STKS; st++)
stocks[st].show();
const Stock * top=&stocks[];
for (st = ; st < STKS; st++)
top=&top->topval(stocks[st]);
std::cout<<"\nMost valuale holding:\n";
top->show();
system("pause");
}

程序清单10.10+10.11+10.12(栈)

#ifndef STACK
#define STACK typedef unsigned long Item; class Stack //类声明
{
private:
enum{MAX=};
Item items[MAX];
int top;
public:
Stack(); //默认构造函数
bool isempty() const;
bool isfull() const;
bool push(const Item & item);//压栈
bool pop(Item & item);//出栈
}; #endif
#include "stack.h"

//构造函数
Stack::Stack(){
top=;
} bool Stack::isempty() const{
return top==;//top为0返回true,反之为false
}
bool Stack::isfull() const{
return top==MAX;
}
bool Stack::push(const Item &item){
if(top<MAX){
items[top++]=item;
return true;
}else
return false;
}
bool Stack::pop(Item &item){
if(top>){
item=items[--top];
return true;
}else
return false;
}
#include<iostream>
#include<cctype>
#include "stack.h"
using namespace std; void main(){
Stack st;
char ch;
unsigned long po;
cout<<"Enter A to add a purchase order, P to process a PO, Q to quit.\n";
while (cin>>ch&&toupper(ch)!='Q')
{
while(cin.get()!='\n')//如果不是换行就继续
continue;
if (!isalpha(ch))//如果不是字母就继续
{
cout<<'\a';
continue;
}
switch (ch)
{
case 'A':
case 'a':
cout<<"Enter a PO number to add: ";
cin>>po;
if(st.isfull())//该方法判断:如果满了(top等于MAX)返回true,没满返回false
cout<<"Stack already full\n";
else
st.push(po);
break;
case 'P':
case 'p':
if(st.isempty())
cout<<"Stack already empty\n";
else{
st.pop(po);
cout<<"PO #"<<po<<" popped\n";
}
break;
}
cout<<"Enter A to add a purchase order, P to process a PO, Q to quit.\n";
}
system("pause");
}

[C++ Primer Plus] 第10章、对象和类(一)程序清单——辨析三个const的更多相关文章

  1. C++ primer plus读书笔记——第10章 对象和类

    第10章 对象和类 1. 基本类型完成了三项工作: 决定数据对象需要的内存数量: 决定如何解释内存中的位: 决定可使用数据对象执行的操作或方法. 2. 不必在类声明中使用关键字private,因为这是 ...

  2. 《C++ Primer Plus》第10章 对象和类 学习笔记

    面向对象编程强调的是程序如何表示数据.使用 OOP 方法解决编程问题的第一步是根据它与程序之间的接口来描述数据,从而指定如何使用数据.然后,设计一个类来实现该接口.一般来说,私有数据成员存储信息,公有 ...

  3. [C++ Primer Plus] 第11章、使用类(一)程序清单——重载 P408

    程序清单11.4~11.6(运算符重载——添加加法运算符) //1.h class Time { private: int hours; int minutes; public: Time(); Ti ...

  4. C++ Primer 5th 第10章 泛型算法

    练习10.1:头文件algorithm中定义了一个名为count的函数,它类似find,接受一对迭代器和一个值作为参数.count返回给定值在序列中出现的次数.编写程序,读取int序列存入vector ...

  5. 《C++ Primer Plus》10.2 抽象和类 学习笔记

    10.2.1 类型是什么基本类型完成了下面的三项工作:* 决定数据对象需要的内存数量:* 决定如何解释内存中的位(long和float在内存中占用的位数相同,但是将它们转换为数值的方法不同):* 决定 ...

  6. [Java核心技术]第四章-对象与类(4.1-4.6总结)

    4.1面向对象程序设计概述 OOP(面向对象编程Object Oriented Programming) OOP中数据第一位,算法第二位. 类 封装:关键在于不能让其他方法直接访问类的实例域,程序仅通 ...

  7. [C++ Primer Plus] 第10章、对象和类(二)课后习题

    1. bank.h #include <string> using namespace std; class BankAccount { private: std::string m_na ...

  8. C Primer Plus 第10章 数组和指针 编程练习

    这章感觉好难啊,放个别人的总结. // 多维数组和指针 #include <stdio.h> int main(void) { int zippo[4][2] = {{2, 4}, {6, ...

  9. C Primer Plus_第10章_数组和指针_编程练习

    1. /*rain.c 针对若干年的降水量数据,计算年降水总量.年降水平均量,以及月降水平均量*/ #include <stdio.h> #define MONTHS 12 #define ...

随机推荐

  1. Python全栈-magedu-2018-笔记2

    第二章 - Python 基础语法 基本语法 注释 -- # 标注的文本 数字 整数,不区分long和int 进制0xa.0o10.0b10 bool,2个值True.False 浮点数 1.2.3. ...

  2. day01 python入门之路

    Python之路,Day1 - Python基础1   本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼 ...

  3. css table之合并单元格

    colspan 是合并列,rowspan是合并行,合并行的时候,比如rowspan="2",它的下一行tr会少一列:合并列的时候 colspan="2",此行的 ...

  4. docker国内镜像源

    https://www.daocloud.io/mirror curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http ...

  5. Jenkins+Jmeter持续集成笔记(五:问题优化)

    通过前面的一系列文章,我的API自动化测试平台已经搭建成型,但是要投入具体项目使用时,还有以下几个问题需要优化. 还是接着以上一篇笔记中的“test_token”项目为例: 1.邮件通知问题 (1)问 ...

  6. 数据库主库从库宕机重启后binlog数据同步

    由于阿里云经典网络迁移到专用网络,一不小心没有先预备方案调整网段, 导致实例无法以内网IP形式访问数据库,被迫进行数据库停机后网络网段调整,导致宕机了几个小时...被客户各种投诉爆了.. 基于这次数据 ...

  7. xcode 10 模拟器报错

    xcode 10(也可能是任意版本)run 模拟器时,发现会报下面的错误. This app could not be installed at this time.Could not access ...

  8. 在C#中,Newtonsoft.Json + dynamic动态解析jsonString,jsonString转实体

    记录一下 引用 using Newtonsoft.Json; using Newtonsoft.Json.Linq; var jsonString = "{\"ApiResourc ...

  9. C#中的反射 Reflection

    起初是因为这个4.0才新增的新的引用类型,我当时很惊讶为什么string和int他都能装,然后我就发在了群里,以为大佬告诉我他的内部实现是通过反射来实现的,于是我就去看反射了,看了网上的好多篇文章大篇 ...

  10. C# 初识Redis

    一.下载:听网上的朋友説的找的是redis for windows ,直接下载即可 https://github.com/ServiceStack/redis-windows 二.下载后解压 文件 r ...