C++ Primer Plus第六版编程练习12.3解答

来源:互联网 发布:百度APP软件中心 编辑:程序博客网 时间:2024/06/08 17:23

stock20.h

// stock20.h -- augmented version#ifndef STOCK20_H_#define STOCK20_H_#include <iostream>class Stock{private:    char * company;    int shares;    double share_val;    double total_val;    void set_tot() { total_val = shares * share_val; }public:    Stock();        // default constructor    Stock(const char * co, long n = 0, double pr = 0.0);    Stock(const Stock & s);    ~Stock();    void buy(long num, double price);    void sell(long num, double price);    void update(double price);    const Stock & topval(const Stock & s) const;    Stock & operator=(const Stock & s);    friend std::ostream & operator<<(std::ostream & os, const Stock & s);};#endif

stock20.cpp

// stock20.cpp -- augmented version#include <iostream>#include "stock20.h"#include <cstring>using namespace std;//default constructorStock::Stock(){    company = new char[1];    company[0] = '\0';    shares = 0;    share_val = 0.0;    total_val = 0.0;}//constructorStock::Stock(const char * co, long n, double pr){    company = new char [strlen(co)+1];    strcpy(company, co);    if (n < 0)    {        std::cout << "Number of shares can't be negative; "                  << company << " shares set to 0.\n";        shares = 0;    }    else        shares = n;    share_val = pr;    set_tot();}//copy constructorStock::Stock(const Stock & s){    company = new char [strlen(s.company)+1];    strcpy(company, s.company);    shares = s.shares;    share_val = s.share_val;    total_val = s.total_val;}//destructorStock::~Stock()        // quiet class destructor{    delete [] company;}//other methodsvoid Stock::buy(long num, double price){    if (num < 0)    {        std::cout << "Number of shares purchased can't be negative. "                  << "Transaction is aborted.\n";    }    else    {        shares += num;        share_val = price;        set_tot();    }}void Stock::sell(long num, double price){    using std::cout;    if (num < 0)    {        cout << "Number of shares sold can't be negative. "             << "Transaction is aborted.\n";    }    else if (num > shares)    {        cout << "You can't sell more than you have! "             << "Transaction is aborted.\n";    }    else    {        shares -= num;        share_val = price;        set_tot();    }}void Stock::update(double price){    share_val = price;    set_tot();}const Stock & Stock::topval(const Stock & s) const{    if (s.total_val > total_val)        return s;    else        return *this;}Stock & Stock::operator=(const Stock & s){    if(this==&s)        return *this;    delete [] company;    company = new char [strlen(s.company)+1];    strcpy(company, s.company);    shares = s.shares;    share_val = s.share_val;    total_val = s.total_val;    return *this;}ostream & operator<<(ostream & os, const Stock & s){    // set format to #.###    ios_base::fmtflags orig =        os.setf(ios_base::fixed, ios_base::floatfield);    streamsize prec = os.precision(3);    os << "Company: " << s.company    << "  Shares: " << s.shares << '\n';    os << "  Share Price: $" << s.share_val;    // set format to #.##    os.precision(2);    os << "  Total Worth: $" << s.total_val << '\n';    // restore original format    os.setf(orig, ios_base::floatfield);    os.precision(prec);    return os;}

usestock20.cpp

// usestok20.cpp -- using the Stock class// compile with stock20.cpp#include <iostream>#include "stock20.h"const int STKS = 4;int main(){    using std::cout;    using std::cin;// create an array of initialized objects    Stock stocks[STKS] =    {        Stock("NanoSmart", 12, 20.0),        Stock("Boffo Objects", 200, 2.0),        Stock("Monolithic Obelisks", 130, 3.25),        Stock("Fleep Enterprises", 60, 6.5)    };    cout << "Stock holdings:\n";    int st;    for (st = 0; st < STKS; st++)        cout << stocks[st];    Stock top = stocks[0];  //use copy constructor    for (st = 1; st < STKS; st++)        top = ( top.topval(stocks[st]) );  //use overloaded = operator    cout << "\nMost valuable holding:\n";    cout<<top;    cin.get();    return 0;}


0 0