[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 ...
随机推荐
- jmeter数据库连接配置
一.实际试过的mysql配置 1.导入一个JDBC jar包(我是直接把jar包放在了jmeter的lib目录),包:mysql-connector-java-5.1.7-bin.jar 2.设置JD ...
- C# DataTable 转 实体类
C# 中查询结果DataTable转实体类: 比如:List<RtmInterview> rtmList = GetDataById( id); public List<RtmInt ...
- Asp.net 使用线程池实例
实际开发经常会使用线程,如果每次使用都是创建线程.启动线程,然后销毁线程,从性能上来讲,非常占用系统开销,当线程达到一定量的时候会影响程序的运行和处理效率. 使用线程池:好处:线程池是一种多线程处理形 ...
- 记录一个bootstrap惨痛的错误
记录一个bootstrap的错误,这个错误因为我删除了一个class就导致了页面上显示的错误,这是一个惨痛的教训,特此记录,提醒自己在做前端的修改时,一定要慎之又慎.如果真的要做改动,改完之后也要测一 ...
- ORACLE——EXTRACT() 截取日期时间的函数使用
1.截取日期的 年: --使用方法 EXTRACT(YEAR FROM DATE) SQL> SELECT EXTRACT( YEAR FROM SYSDATE ) FROM DUAL; --结 ...
- 【Linux】Centos partition
http://www.cnblogs.com/yogurtwu/p/9494108.html https://www.cnblogs.com/zhangkaimin/p/6251448.html wh ...
- Xamarin.Forms FlexLayout 布局扩展+ 模板扩展+弹性换行
Binding a FlexLayout to a Collection In May we published a doc on the new FlexLayout control that’ ...
- 又见thrift异常之TApplicationException: Internal error processing..
客户端调用获取商户提现产品手续费的接口,出现异常org.apache.thrift.TApplicationException: Internal error processing getMercha ...
- CSS常见兼容问题以及解决办法
浏览器的兼容性问题,通常是因为不同的浏览器对同一段代码有不同的解析,造成页面显示不统一的情况. 这里谈到的浏览器,主要指IE6/IE7/IE... FireFox Chrome Opera Safar ...
- nodejs:导出Excel和解析导入的Excel
用的是koa2框架,但好好处理一下,用express框架也是可以的.导出的Excel是xlsx的格式,解析导入Excel的有xlsx和csv格式.通常导入Excel是要上传的,然后获取文件的路径,这里 ...