[C++ Primer Plus] 第10章、对象和类(一)程序清单——辨析三个const
程序清单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的更多相关文章
- C++ primer plus读书笔记——第10章 对象和类
第10章 对象和类 1. 基本类型完成了三项工作: 决定数据对象需要的内存数量: 决定如何解释内存中的位: 决定可使用数据对象执行的操作或方法. 2. 不必在类声明中使用关键字private,因为这是 ...
- 《C++ Primer Plus》第10章 对象和类 学习笔记
面向对象编程强调的是程序如何表示数据.使用 OOP 方法解决编程问题的第一步是根据它与程序之间的接口来描述数据,从而指定如何使用数据.然后,设计一个类来实现该接口.一般来说,私有数据成员存储信息,公有 ...
- [C++ Primer Plus] 第11章、使用类(一)程序清单——重载 P408
程序清单11.4~11.6(运算符重载——添加加法运算符) //1.h class Time { private: int hours; int minutes; public: Time(); Ti ...
- C++ Primer 5th 第10章 泛型算法
练习10.1:头文件algorithm中定义了一个名为count的函数,它类似find,接受一对迭代器和一个值作为参数.count返回给定值在序列中出现的次数.编写程序,读取int序列存入vector ...
- 《C++ Primer Plus》10.2 抽象和类 学习笔记
10.2.1 类型是什么基本类型完成了下面的三项工作:* 决定数据对象需要的内存数量:* 决定如何解释内存中的位(long和float在内存中占用的位数相同,但是将它们转换为数值的方法不同):* 决定 ...
- [Java核心技术]第四章-对象与类(4.1-4.6总结)
4.1面向对象程序设计概述 OOP(面向对象编程Object Oriented Programming) OOP中数据第一位,算法第二位. 类 封装:关键在于不能让其他方法直接访问类的实例域,程序仅通 ...
- [C++ Primer Plus] 第10章、对象和类(二)课后习题
1. bank.h #include <string> using namespace std; class BankAccount { private: std::string m_na ...
- C Primer Plus 第10章 数组和指针 编程练习
这章感觉好难啊,放个别人的总结. // 多维数组和指针 #include <stdio.h> int main(void) { int zippo[4][2] = {{2, 4}, {6, ...
- C Primer Plus_第10章_数组和指针_编程练习
1. /*rain.c 针对若干年的降水量数据,计算年降水总量.年降水平均量,以及月降水平均量*/ #include <stdio.h> #define MONTHS 12 #define ...
随机推荐
- css学习_css3伸缩布局 flex布局
1.flex布局 案例一: 案例二: 保证不至于缩放得太小或太大 案例三:flex的值不一定要写成几份,可以写成固定值 案例四: 竖着3等分(父容器按照高度3等分) !!案例 -----用fle ...
- 旧版本的firefox 下载 和 安装(查找web元素路径) ---web 元素 自动化测试
ftp.mozilla.orgpubfirefoxreleases 旧版下载地址 选择47版本 因为48后面的会进行插件校验 这样firepath安装不成功 安装文件:在百度 ...
- 输入URL地址到页面加载完成 过程
在浏览器的地址栏中输入URL地址"http://www.gacl.cn:8080/JavaWebDemo1/1.jsp"去访问服务器上的1.jsp这个web资源的过程 1.浏览器根 ...
- /etc/inittab文件详解
/etc/inittab由/sbin/init程序解析调用,用于系统初始化,/sbin/init可参考源码busybox中init.c的实现方式. 原址如下: http://leejia.blog.5 ...
- iOS 反调试
反调试主要分为两种,第一种阻止调试器附加,第二种是检测是否有调试器存在 1.ptrace是系统用来对运行中的进程进行调试和跟踪的工具,通过ptrace,可以对另一个进程实现调试跟踪.但是里面提供了一个 ...
- 3.远程连接工具、JDK安装
1.实现Centos和windows的文件传输,可以使用Xshell和Xftp(实验指导使用的是winscp). (1).可以使用Xshell远程登陆Linux,具体安装过程略. (2).登陆Cent ...
- NAT(Network Address Translation)
一.概述 NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force, I ...
- opencart3产品页调用upc/数量等信息
opencart3产品页默认只调用标题.价格.型号等几个数据,如果想要调用更多的参数要如何操作呢?跟着ytkah一起来看看吧.首先打开/catalog/model/catalog/product.ph ...
- 学习animate.css包含了一组炫酷、有趣、跨浏览器的动画
1.animate.css包含了一组炫酷.有趣.跨浏览器的动画,可以在你的项目中直接使用. 第一步:引入animate.css样式文件或者引入某些平台的CDN文件: <head> < ...
- pwn学习日记Day1 基础知识积累
ida / od 窗口(针对od操作) 反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址.HEX 数据.反汇编.注释可以通过在窗口中右击出现的菜单 界面选项->隐藏标题 或 显示标题 来进 ...