程序清单10.1+10.2+10.3

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

stock.cpp

  1. #include<iostream>
  2. #include "stock.h"
  3.  
  4. void Stock::acquire(const std::string &co,long n,double pr){
  5. company=co;
  6. if(n<){
  7. std::cout<<company<<std::endl;
  8. shares=;
  9. }else
  10. shares=n;
  11. share_val=pr;
  12. set_tot();
  13. }
  14.  
  15. void Stock::buy(long num,double price){
  16. if(num<)
  17. std::cout<<"Error!\n";
  18. else{
  19. shares+=num;
  20. share_val=price;
  21. set_tot();
  22. }
  23. }
  24.  
  25. void Stock::sell(long num,double price){
  26. using std::cout;
  27. if(num<)
  28. cout<<"Error!\n";
  29. else if(num>shares)
  30. cout<<"You can not sell more than you have!\n";
  31. else{
  32. shares-=num;
  33. share_val=price;
  34. set_tot();
  35. }
  36. }
  37.  
  38. void Stock::update(double price){
  39. share_val=price;
  40. set_tot();
  41. }
  42.  
  43. void Stock::show(){
  44. std::cout<<"Company: "<<company<<", Shares:"<<shares<<"\nShare Price: $"<<share_val<<", Total Worth: $"<<total_val<<'\n';
  45. }

main.cpp

  1. //用于测试Stock类的设计
  2. #include<iostream>
  3. #include "stock.h"
  4.  
  5. void main(){
  6. Stock cat;
  7. cat.acquire("NanoSmart",,12.50);
  8. cat.show();
  9. cat.buy(,18.125);
  10. cat.show();
  11. cat.sell(,20.0);
  12. cat.show();
  13. cat.buy(,40.125);
  14. cat.show();
  15. cat.sell(,0.125);
  16. cat.show();
  17. system("pause");
  18. }

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

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

小结

构造函数和析构函数

程序清单10.4+10.5+10.6

头文件

  1. #ifndef STOCK10_H_ //先测试x是否被宏定义过
  2. #define STOCK10_H_ //如果没有宏定义,就宏定义x并编译下面的语句
  3. #include <string>
  4.  
  5. class Stock //类声明
  6. {
  7. private:
  8. std::string company;
  9. long shares;
  10. double share_val;
  11. double total_val;
  12. void set_tot() { total_val=shares*share_val; }
  13. public:
  14. Stock(); //默认构造函数
  15. Stock(const std::string &co,long n=,double pr=0.0);
  16. ~Stock(); //析构函数
  17. void buy(long num,double price);
  18. void sell(long num,double price);
  19. void update(double price);
  20. void show();
  21. }; //千万别忘了分号
  22.  
  23. #endif //如果已经定义了则编译#endif后面的语句

函数定义

  1. #include<iostream>
  2. #include "stock.h"
  3. using namespace std;
  4.  
  5. //构造函数
  6. Stock::Stock(){
  7. cout<<"Default constructor called\n";
  8. company="no name";
  9. shares=;
  10. share_val=0.0;
  11. total_val=0.0;
  12. }
  13. Stock::Stock(const std::string &co,long n,double pr){
  14. cout<<"Constructor using "<<co<<" called\n";
  15. company=co;
  16. if(n<){
  17. cout<<company<<endl;
  18. shares=;
  19. }else
  20. shares=n;
  21. share_val=pr;
  22. set_tot();
  23. }
  24. //类的析构函数
  25. Stock::~Stock(){
  26. cout<<"Bye, "<<company<<endl;
  27. }
  28.  
  29. void Stock::buy(long num,double price){
  30. if(num<)
  31. std::cout<<"Error!\n";
  32. else{
  33. shares+=num;
  34. share_val=price;
  35. set_tot();
  36. }
  37. }
  38.  
  39. void Stock::sell(long num,double price){
  40. if(num<)
  41. cout<<"Error!\n";
  42. else if(num>shares)
  43. cout<<"You can not sell more than you have!\n";
  44. else{
  45. shares-=num;
  46. share_val=price;
  47. set_tot();
  48. }
  49. }
  50.  
  51. void Stock::update(double price){
  52. share_val=price;
  53. set_tot();
  54. }
  55.  
  56. void Stock::show(){
  57. ios_base::fmtflags orig=cout.setf(ios_base::fixed,ios_base::floatfield);//设置cout对象的一个标记,命令cout使用定点表示法
  58. streamsize prec=cout.precision();//cout使用定点表示法时,显示三位小数
  59. cout<<"Company: "<<company<<", Shares:"<<shares<<"\nShare Price: $"<<share_val;
  60. cout.precision();//显示2位小数
  61. cout<<", Total Worth: $"<<total_val<<endl;
  62. cout.setf(orig,ios_base::floatfield);
  63. cout.precision(prec);
  64. }

主函数

  1. #include<iostream>
  2. #include "stock.h"
  3.  
  4. void main(){
  5. {
  6. using std::cout;
  7. cout<<"Using constructors to create new objects!!!\n";
  8. Stock stock1("NanoSmart",,20.0);
  9. stock1.show();
  10. Stock stock2=Stock ("Boffo Object",,2.0);
  11. stock2.show();
  12.  
  13. cout<<"Assigning stock1 to stock2!!!\n";
  14. stock2=stock1;
  15. cout<<"Listing stock1 and stock2:\n";
  16. stock1.show();
  17. stock2.show();
  18.  
  19. cout<<"Using a constructor to reset an object!!!\n";
  20. stock1=Stock("Nifty Foods",,50.0);
  21. cout<<"Revised stock1:\n";
  22. stock1.show();
  23. cout<<"Done\n";
  24. }//代码执行到此处后,调用析构函数。若没有这对括号,程序将在代码退出时调用(即我们无法观察到析构函数的调用)
  25. system("pause");
  26. }

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

栈先进后出

辨析三个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)

  1. #ifndef STOCK
  2. #define STOCK
  3. #include <string>
  4.  
  5. class Stock //类声明
  6. {
  7. private:
  8. std::string company;
  9. long shares;
  10. double share_val;
  11. double total_val;
  12. void set_tot() { total_val=shares*share_val; }
  13. public:
  14. Stock(); //默认构造函数
  15. Stock(const std::string &co,long n=,double pr=0.0);
  16. ~Stock(); //析构函数
  17. void buy(long num,double price);
  18. void sell(long num,double price);
  19. void update(double price);
  20. void show() const; //const在后面表示不可修改函数内部的值
  21. const Stock & topval(const Stock &s) const;//返回const Stock类型的引用:参数是引用,返回值也是引用
  22. }; //千万别忘了分号
  23.  
  24. #endif
  1. #include<iostream>
  2. #include "stock.h"
  3. using namespace std;
  4.  
  5. //构造函数
  6. Stock::Stock(){
  7. company="no name";
  8. shares=;
  9. share_val=0.0;
  10. total_val=0.0;
  11. }
  12. Stock::Stock(const std::string &co,long n,double pr){
  13. company=co;
  14. if(n<){
  15. cout<<company<<endl;
  16. shares=;
  17. }else
  18. shares=n;
  19. share_val=pr;
  20. set_tot();
  21. }
  22. //类的析构函数
  23. Stock::~Stock(){
  24. }
  25.  
  26. void Stock::buy(long num,double price){
  27. if(num<)
  28. std::cout<<"Error!\n";
  29. else{
  30. shares+=num;
  31. share_val=price;
  32. set_tot();
  33. }
  34. }
  35.  
  36. void Stock::sell(long num,double price){
  37. if(num<)
  38. cout<<"Error!\n";
  39. else if(num>shares)
  40. cout<<"You can not sell more than you have!\n";
  41. else{
  42. shares-=num;
  43. share_val=price;
  44. set_tot();
  45. }
  46. }
  47.  
  48. void Stock::update(double price){
  49. share_val=price;
  50. set_tot();
  51. }
  52.  
  53. void Stock::show() const{
  54. ios_base::fmtflags orig=cout.setf(ios_base::fixed,ios_base::floatfield);//设置cout对象的一个标记,命令cout使用定点表示法
  55. streamsize prec=cout.precision();//cout使用定点表示法时,显示三位小数
  56. cout<<"Company: "<<company<<", Shares:"<<shares<<"\n Share Price: $"<<share_val;
  57. cout.precision();//显示2位小数
  58. cout<<", Total Worth: $"<<total_val<<endl;
  59. cout.setf(orig,ios_base::floatfield);
  60. cout.precision(prec);
  61. }
  62.  
  63. const Stock & Stock::topval(const Stock &s) const{
  64. if(s.total_val>total_val)
  65. return s;
  66. else
  67. return *this;
  68. }
  1. #include<iostream>
  2. #include "stock.h"
  3.  
  4. const int STKS=;
  5. void main(){
  6. Stock stocks[STKS]={
  7. Stock("Nano",,20.0),
  8. Stock("Boffo",,2.0),
  9. Stock("Mono",,3.25),
  10. Stock("Fleep",,6.5),
  11. };
  12. std::cout<<"Stock holdings:\n";
  13. int st;
  14. for (st = ; st < STKS; st++)
  15. stocks[st].show();
  16. const Stock * top=&stocks[];
  17. for (st = ; st < STKS; st++)
  18. top=&top->topval(stocks[st]);
  19. std::cout<<"\nMost valuale holding:\n";
  20. top->show();
  21. system("pause");
  22. }

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

  1. #ifndef STACK
  2. #define STACK
  3.  
  4. typedef unsigned long Item;
  5.  
  6. class Stack //类声明
  7. {
  8. private:
  9. enum{MAX=};
  10. Item items[MAX];
  11. int top;
  12. public:
  13. Stack(); //默认构造函数
  14. bool isempty() const;
  15. bool isfull() const;
  16. bool push(const Item & item);//压栈
  17. bool pop(Item & item);//出栈
  18. };
  19.  
  20. #endif
  1. #include "stack.h"
  2.  
  3. //构造函数
  4. Stack::Stack(){
  5. top=;
  6. }
  7.  
  8. bool Stack::isempty() const{
  9. return top==;//top为0返回true,反之为false
  10. }
  11. bool Stack::isfull() const{
  12. return top==MAX;
  13. }
  14. bool Stack::push(const Item &item){
  15. if(top<MAX){
  16. items[top++]=item;
  17. return true;
  18. }else
  19. return false;
  20. }
  21. bool Stack::pop(Item &item){
  22. if(top>){
  23. item=items[--top];
  24. return true;
  25. }else
  26. return false;
  27. }
  1. #include<iostream>
  2. #include<cctype>
  3. #include "stack.h"
  4. using namespace std;
  5.  
  6. void main(){
  7. Stack st;
  8. char ch;
  9. unsigned long po;
  10. cout<<"Enter A to add a purchase order, P to process a PO, Q to quit.\n";
  11. while (cin>>ch&&toupper(ch)!='Q')
  12. {
  13. while(cin.get()!='\n')//如果不是换行就继续
  14. continue;
  15. if (!isalpha(ch))//如果不是字母就继续
  16. {
  17. cout<<'\a';
  18. continue;
  19. }
  20. switch (ch)
  21. {
  22. case 'A':
  23. case 'a':
  24. cout<<"Enter a PO number to add: ";
  25. cin>>po;
  26. if(st.isfull())//该方法判断:如果满了(top等于MAX)返回true,没满返回false
  27. cout<<"Stack already full\n";
  28. else
  29. st.push(po);
  30. break;
  31. case 'P':
  32. case 'p':
  33. if(st.isempty())
  34. cout<<"Stack already empty\n";
  35. else{
  36. st.pop(po);
  37. cout<<"PO #"<<po<<" popped\n";
  38. }
  39. break;
  40. }
  41. cout<<"Enter A to add a purchase order, P to process a PO, Q to quit.\n";
  42. }
  43. system("pause");
  44. }

[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. css学习_css3伸缩布局 flex布局

    1.flex布局 案例一: 案例二:   保证不至于缩放得太小或太大 案例三:flex的值不一定要写成几份,可以写成固定值 案例四: 竖着3等分(父容器按照高度3等分) !!案例  -----用fle ...

  2. 旧版本的firefox 下载 和 安装(查找web元素路径) ---web 元素 自动化测试

    ftp.mozilla.orgpubfirefoxreleases   旧版下载地址   选择47版本     因为48后面的会进行插件校验    这样firepath安装不成功   安装文件:在百度 ...

  3. 输入URL地址到页面加载完成 过程

    在浏览器的地址栏中输入URL地址"http://www.gacl.cn:8080/JavaWebDemo1/1.jsp"去访问服务器上的1.jsp这个web资源的过程 1.浏览器根 ...

  4. /etc/inittab文件详解

    /etc/inittab由/sbin/init程序解析调用,用于系统初始化,/sbin/init可参考源码busybox中init.c的实现方式. 原址如下: http://leejia.blog.5 ...

  5. iOS 反调试

    反调试主要分为两种,第一种阻止调试器附加,第二种是检测是否有调试器存在 1.ptrace是系统用来对运行中的进程进行调试和跟踪的工具,通过ptrace,可以对另一个进程实现调试跟踪.但是里面提供了一个 ...

  6. 3.远程连接工具、JDK安装

    1.实现Centos和windows的文件传输,可以使用Xshell和Xftp(实验指导使用的是winscp). (1).可以使用Xshell远程登陆Linux,具体安装过程略. (2).登陆Cent ...

  7. NAT(Network Address Translation)

    一.概述 NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force, I ...

  8. opencart3产品页调用upc/数量等信息

    opencart3产品页默认只调用标题.价格.型号等几个数据,如果想要调用更多的参数要如何操作呢?跟着ytkah一起来看看吧.首先打开/catalog/model/catalog/product.ph ...

  9. 学习animate.css包含了一组炫酷、有趣、跨浏览器的动画

    1.animate.css包含了一组炫酷.有趣.跨浏览器的动画,可以在你的项目中直接使用. 第一步:引入animate.css样式文件或者引入某些平台的CDN文件: <head> < ...

  10. pwn学习日记Day1 基础知识积累

    ida / od 窗口(针对od操作) 反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址.HEX 数据.反汇编.注释可以通过在窗口中右击出现的菜单 界面选项->隐藏标题 或 显示标题 来进 ...