第10章 对象和类

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值