zoukankan      html  css  js  c++  java
  • [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<0){
            std::cout<<company<<std::endl;
            shares=0;
        }else
            shares=n;
        share_val=pr;
        set_tot();
    } 
        
    void Stock::buy(long num,double price){
        if(num<0)
            std::cout<<"Error!
    ";
        else{
            shares+=num;
            share_val=price;
            set_tot();
        }
    } 
    
    void Stock::sell(long num,double price){
        using std::cout;
        if(num<0)
            cout<<"Error!
    ";
        else if(num>shares)
            cout<<"You can not sell more than you have!
    ";
        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<<"
    Share Price: $"<<share_val<<", Total Worth: $"<<total_val<<'
    ';
    }

    main.cpp

    //用于测试Stock类的设计
    #include<iostream>
    #include "stock.h"
    
    void main(){
        Stock cat;
        cat.acquire("NanoSmart",20,12.50);
        cat.show();
        cat.buy(15,18.125);
        cat.show();
        cat.sell(400,20.0);
        cat.show();
        cat.buy(300000,40.125);
        cat.show();
        cat.sell(300000,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(3);//cout使用定点表示法时,显示三位小数
    
        cout<<"Company: "<<company<<", Shares:"<<shares<<"
    Share Price: $"<<share_val<<", Total Worth: $"<<total_val<<'
    ';
        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=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    //如果已经定义了则编译#endif后面的语句

    函数定义

    #include<iostream>
    #include "stock.h"
    using namespace std;
    
    //构造函数
    Stock::Stock(){
        cout<<"Default constructor called
    ";
        company="no name";
        shares=0;
        share_val=0.0;
        total_val=0.0;
    }
    Stock::Stock(const std::string &co,long n,double pr){
        cout<<"Constructor using "<<co<<" called
    ";
        company=co;
        if(n<0){
            cout<<company<<endl;
            shares=0;
        }else
            shares=n;
        share_val=pr;
        set_tot();
    } 
    //类的析构函数
    Stock::~Stock(){
        cout<<"Bye, "<<company<<endl;
    }
        
    void Stock::buy(long num,double price){
        if(num<0)
            std::cout<<"Error!
    ";
        else{
            shares+=num;
            share_val=price;
            set_tot();
        }
    } 
    
    void Stock::sell(long num,double price){
        if(num<0)
            cout<<"Error!
    ";
        else if(num>shares)
            cout<<"You can not sell more than you have!
    ";
        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(3);//cout使用定点表示法时,显示三位小数
        cout<<"Company: "<<company<<", Shares:"<<shares<<"
    Share Price: $"<<share_val;
        cout.precision(2);//显示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!!!
    ";
            Stock stock1("NanoSmart",12,20.0);
            stock1.show();
            Stock stock2=Stock ("Boffo Object",2,2.0);
            stock2.show();
    
            cout<<"Assigning stock1 to stock2!!!
    ";
            stock2=stock1;
            cout<<"Listing stock1 and stock2:
    ";
            stock1.show();
            stock2.show();
    
            cout<<"Using a constructor to reset an object!!!
    ";
            stock1=Stock("Nifty Foods",10,50.0);
            cout<<"Revised stock1:
    ";
            stock1.show();
            cout<<"Done
    ";
        }//代码执行到此处后,调用析构函数。若没有这对括号,程序将在代码退出时调用(即我们无法观察到析构函数的调用)
        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=0,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=0;
        share_val=0.0;
        total_val=0.0;
    }
    Stock::Stock(const std::string &co,long n,double pr){
        company=co;
        if(n<0){
            cout<<company<<endl;
            shares=0;
        }else
            shares=n;
        share_val=pr;
        set_tot();
    } 
    //类的析构函数
    Stock::~Stock(){
    }
        
    void Stock::buy(long num,double price){
        if(num<0)
            std::cout<<"Error!
    ";
        else{
            shares+=num;
            share_val=price;
            set_tot();
        }
    } 
    
    void Stock::sell(long num,double price){
        if(num<0)
            cout<<"Error!
    ";
        else if(num>shares)
            cout<<"You can not sell more than you have!
    ";
        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(3);//cout使用定点表示法时,显示三位小数
        cout<<"Company: "<<company<<", Shares:"<<shares<<"
        Share Price: $"<<share_val;
        cout.precision(2);//显示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=4;
    void main(){
        Stock stocks[STKS]={
            Stock("Nano",12,20.0),
            Stock("Boffo",200,2.0),
            Stock("Mono",130,3.25),
            Stock("Fleep",60,6.5),
        };
        std::cout<<"Stock holdings:
    ";
        int st;
        for (st = 0; st < STKS; st++)
            stocks[st].show();
        const Stock * top=&stocks[0];
        for (st = 1; st < STKS; st++)
            top=&top->topval(stocks[st]);
        std::cout<<"
    Most valuale holding:
    ";
        top->show();
        system("pause");
    }

    程序清单10.10+10.11+10.12(栈)

    #ifndef STACK    
    #define STACK    
    
    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    
    #include "stack.h"
    
    //构造函数
    Stack::Stack(){
        top=0;
    }
    
    bool Stack::isempty() const{
        return top==0;//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>0){
            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.
    ";
        while (cin>>ch&&toupper(ch)!='Q')
        {
            while(cin.get()!='
    ')//如果不是换行就继续
                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
    ";
                else
                    st.push(po);
                break;
            case 'P':
            case 'p':
                if(st.isempty())
                    cout<<"Stack already empty
    ";
                else{
                    st.pop(po);
                    cout<<"PO #"<<po<<" popped
    ";
                }
                break;
            }
            cout<<"Enter A to add a purchase order, P to process a PO, Q to quit.
    ";
        }
        system("pause");
    }

  • 相关阅读:
    sharepoint ECMA 添加指定的人员和指定的角色到某个list里
    sharepoint ECMA 添加User到Site组
    sharepoint ECMA PeopleEditor 清除选中的中的人员
    sharepoinT Modal Dialog
    sharepoint ECMA
    sharepoint 列表查询范围
    sharepoint 2013 添加Quickpart
    背包、队列和栈
    Java 同步块
    Andriod性能优化笔记
  • 原文地址:https://www.cnblogs.com/little-monkey/p/7719614.html
Copyright © 2011-2022 走看看