第10章 对象和类

来源:互联网 发布:杂志排版软件 编辑:程序博客网 时间:2024/05/16 05:30

1.对象和类的简单例子,包括一个.h文件,两个.cpp文件。股票数量和价格。
stock10.h

#ifndef STOCK10_H_#define STOCK10_H_#include<string>using namespace std;class Stock{private:    string company;    long shares;    double share_val;    double total_val;    void set_tot()    {        total_val=shares*share_val;    }public:    Stock();    Stock(const string &co,long n=0,double pr=0.0);    ~Stock();    void buy(long num,double price);    void sell(long num,double price);    void update(double price);    void show();};#endif

stock10.cpp

#include<iostream>#include"stock10.h"using namespace std;Stock::Stock(){    cout<<"Default constructor called\n";    company="no name";    shares=0;    share_val=0.0;    total_val=0.0;}Stock::Stock(const string &co,long n,double pr){    cout<<"my constructor called\n";    company=co;    shares=n;    share_val=pr;    set_tot();}Stock::~Stock(){    cout<<"Bye, "<<company<<"\n";}void Stock::buy(long num,double price){    shares=shares+num;    share_val=price;    set_tot();}void Stock::sell(long num,double price){    cout<<"sell:\n";    shares=shares-num;    share_val=price;    set_tot();}void Stock::update(double price){    share_val=price;    set_tot();}void Stock::show(){    cout<<"Company: "<<company<<"Shares: "<<shares<<endl;    cout<<"share price: "<<share_val<<" total worth:"<<total_val<<endl;}

usestock.cpp

#include<iostream>#include"stock10.h"using namespace std;int main(){    {        cout<<"Using constructor to creat a new object!\n";        Stock stock1("Nanosmart",12,20.0);        stock1.show();        Stock stock2=Stock("Boffo Objects",2,2.0);        stock2.show();        stock2.buy(100,12);        stock2.show();        cout<<endl;        stock2.sell(50,10);        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",10,50.0);        cout<<"Revised stock1:\n";        stock1.show();        cout<<"done!";    }    return 0;}

2.this指针
.h文件修改

const Stock & Stock::topval(const Stock &s)const;

.cpp的类方法的实现的修改

const Stock & Stock::topval(const Stock &s)const{    if(s.total_val>total_val)        return s;    else        return *this;}

.cpp的main函数修改

cout<<"*this:较高的是:\n";        Stock top;        top=stock1.topval(stock2);        top.show();

3.ADT用类来进行描述
stack.h

#ifndef STACK_H_#define STACK_H_typedef unsigned long Item;class Stack{private:    enum{MAX=10};    Item items[MAX];    int top;public:    Stack();    bool isempty()const;    bool isfull()const;    bool push(const Item &item);    bool pop(Item &item);};//注意有分号!!#endif

stack.cpp

#include "stack.h"Stack::Stack(){    top=0;}bool Stack::isempty()const{    return top==0;}bool Stack::isfull()const{    return top==MAX;}bool Stack::pop( Item &item){    if(top>0)    {    item=items[--top];    return true;    }    else         return false;}bool Stack::push(const Item &item){    if(top<MAX)    {        items[top++]=item;        return true;    }    else        return false;}

stacker.cpp

#include<iostream>#include<cctype>#include"stack.h"using namespace std;int main(){    Stack st;    char ch;    unsigned long po;    cout<<"Please enter A to add a purchase order,\n"        <<"P to process a po,or Q to quit.\n";    cin>>ch;    while(ch!='q')    {        if(!isalpha(ch))        {   cout<<"error input!\n";            continue;        }        switch(ch)        {        case 'A':        case 'a':cout<<"Enter a PO number to add:";                 cin>>po;                 if(st.isfull())                     cout<<"stack is 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<<" poped\n";                  }                  break;        }        cout<<"Please enter A to add a purchase order,\n"        <<"P to process a po,or Q to quit.\n";        cin>>ch;    }    cout<<"BYE!\n";    return 0;}

4.移动x,y. 返回类型为Move的对象 可以用Move的构造方法!!
move.h

#ifndef MOVE_H_#define MOVE_H_class Move{private:    double x;    double y;public:    Move(double a=0,double b=0);    void showmove()const;    Move add(const Move &m)const;    void reset(double a=0,double b=0);};#endif

move.cpp

#include<iostream>#include"move.h"using namespace std;Move::Move(double a,double b){    x=a;    y=b;}void Move::showmove()const{    cout<<"now x="<<x<<"  y="<<y<<endl;}Move  Move::add(const Move &m)const   //重要!!{    return(Move(x+m.x,y+m.y));}void Move::reset(double a,double b){    x=a;    y=b;}

usemove.cpp

#include<iostream>#include"move.h"using namespace std;int main(){    Move();    Move m1=Move(2.0,3.0);    Move m2=Move(1.0,2.0);    m1.showmove();    m1.add(m2).showmove(); //用m1.add(m2);m1.showmove(); 这样并没有改变m1的值。    m2.reset(3.4,4.5);    m2.showmove();    cout<<"BYe!"<<endl;}
0 0