#ifndef STOCK20
#define STOCK20
#include "string.h"
//定义类的各种成员属性和成员方法
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);
~Stock();
void buy(long num,double price);
void sell(long num,double price);
void updata(double price);
void show() const;
const Stock & topval(const Stock & a) const;
//前面一个stock作为的是一个stock的对象 后面一个也是一个stock的对象
};//最后要加分号
#endif // STOCK20
#include <iostream>
#include"stock20.h"
Stock::Stock()
{
std::cout<<"Default constructor called\n";
company = "no name";
shares = 0;
share_val = 0.0;
total_val = 0.0;
}
Stock::Stock(const std::string &co, long n, double pr)
{
std::cout<<"Constructor using "<<co<<"called\n";
company = co;
if(n<0)
{
std::cout<<"Number of shares can't bt negative;"
<<company<<"shares set to 0.\n";
shares = 0;
}
else
shares = n;
share_val = pr;
set_tot();
}
Stock::~Stock()
{
std::cout<<"Bye,"<<company<<"!\n";
}
void Stock::buy(long num, double price)
{
if(num<0)
{
std::cout<<"You can not buy negative";
}
else
shares +=num;
share_val =price;
set_tot();
}
void Stock::sell(long num, double price)
{
if(num<0)
{
std::cout<<"Don't be a negative num."<<std::endl;
}
if(num>shares)
{
std::cout<<"You can not sell so mush"<<std::endl;
}
else
shares -= num;
share_val = price;
set_tot();
}
void Stock::updata(double price)
{
share_val = price;
set_tot();
}
/*
void Stock::show()
{
std::cout<<"company: "<<company<<std::endl
<<" shares: "<<shares<<std::endl
<<" shares_val: "<<share_val<<std::endl
<<" Total Worth: "<<total_val<<std::endl;
}
*/
void Stock::show()const//这里一定要加const保证隐式的引用不会被修改
//error: passing 'const Stock' as 'this' argument of 'void Stock::show()'
//discards qualifiers
//top->show();
{
using std::cout;
using std::endl;
using std::ios_base;
ios_base::fmtflags orig =
cout.setf(ios_base::fixed,ios_base::floatfield);
//定义这是流文件的长度
std::streamsize prec = cout.precision(3);
cout<<"Company: " <<company
<<"Shares: "<<shares<<endl;
cout<<"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 & a)const
* 描述:比较两个对象的某一属性的值
* 输入 :静态的stock对象
* 输出 :比较大的stock对象
*/
const Stock & Stock::topval(const Stock & a)const
{
if(a.total_val>total_val)//后面的是代表当前的stock
return a;
else
return *this;//这里的意思是返回一整个对象
}
#include <iostream>
#include"stock20.h"
const int STKS = 4;
int main()
{
std::cout<<"zzm";
Stock stocks[STKS] =
{
Stock{"NanoSmart",12,20},
Stock{"Boffo Objects",200,2},
};//到最后都调用了析构函数
std::cout<<"Stock holdings:\n";
int st;
for(st=0;st<STKS;st++)
stocks[st].show();
//set pointer to first element
const Stock *top =&stocks[0];
for(st=1;st<STKS;st++)
top =& top->topval(stocks[st]);//top->...返回的是一个值
//最大的指针是指向最大值的
std::cout<<"\nMost valuable holding:\n";
top->show();
return 0;
}
面向对象的章节的内容