程序清单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 学习笔记5 变量-列表

    列表是python常用的一种变量. 是由一些列按照特定顺序排列的元素组成的.你可以创建包含字母表中的所有字母,数字.可以将任何东西都加入到列表中. 通常情况下,列表中都包含多个元素,所以建议变量的名称 ...

  2. gdb调试用法

    目录 一.gdb功能简介 二.gdb使用前置条件:编译时加入debug信息. 三.gdb最常见的几个用法: 1.gdb的启动,加载程序: 2.调试正在运行的程序: 3. 查core: 四.gdb常用命 ...

  3. [dev] 中文版内核代码编码规范

    我是我最喜欢的编码规范.并始终坚持. https://www.kernel.org/doc/html/v4.15/translations/zh_CN/coding-style.html

  4. 《PHP内核剖析 - 变量/内存管理》

    本文总结自: <PHP7 内核剖析 - 变量的内部实现> 一:变量的实现 - 变量是一个语言实现的基础. - 在PHP中,变量的组成部分为 变量名(zval) 变量值(zend_value ...

  5. leetcode 之 Two Sum II - Input array is sorted c++

    class Solution { public: vector<int> twoSum(vector<int>& numbers, int target) { int ...

  6. oracle树形结构全路径查询

    很实用的语法,父子节点通过id与patientId来关联,知道子节点的id,想查出所有的父节点: START WITH ...CONNECT BY ... SELECT T2.ORG_FULLNAME ...

  7. C++ MFC万能的类向导

    MFC的类向导 只要你掌握了类向导,你基本就已经掌握了MFC了,毕竟布局和代码都是自动生成,再加上C++基础上手还是挺快的,剩下的就是多多练习了. 转自: https://blog.csdn.net/ ...

  8. CSAPP:第一章学习笔记:斗之气1段

    一.信息就是位+上下文:系统中的所有信息(包括磁盘文件.内存中的程序.网络上传送的数据),都是由一串比特表示,根据上下文对这些比特表示进行翻译. 二.C程序编译过程 1.源码结构 // test.c ...

  9. java操作对比两个字符串,将差异数据提取出来

    记录瞬间 在实际的工作中,需要解决生成两次字符串结果进行对比的问题,将存在差异的字符串直接给出来. 当然,前提是需要将对比的两次结果,进行前期处理 比如: a_str = "@com/ene ...

  10. DLG消息

    WM_GETMINMAXINFO 0X0024 WM_NCCREATE 0X0081 WM_NCCALCSIZE 0X0083   WM_CREATE 0X0001 WM_SIZE 0X0005 WM ...