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

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

string2.h

// string2.h -- fixed and augmented string class definition#ifndef STRING2_H_#define STRING2_H_#include <iostream>using std::ostream;using std::istream;class String{private:    char * str;             // pointer to string    int len;                // length of string    static int num_strings; // number of objects    static const int CINLIM = 80;  // cin input limitpublic:// constructors and other methods    String(const char * s); // constructor    String();               // default constructor    String(const String &); // copy constructor    ~String();              // destructor    int length () const {return len;}// overloaded operator methods    String & operator=(const String &);    String & operator=(const char *);    char & operator[](int i);    const char & operator[](int i) const;    void stringlow();    void stringup();    int has(char ch);// overloaded operator friends    friend String operator+(const String &st, const String &st2);    friend bool operator<(const String &st, const String &st2);    friend bool operator>(const String &st1, const String &st2);    friend bool operator==(const String &st, const String &st2);    friend ostream & operator<<(ostream & os, const String & st);    friend istream & operator>>(istream & is, String & st);// static function    static int HowMany();};#endif

string2.cpp

// string2.cpp -- String class methods#include <cstring>                 // string.h for some#include "string2.h"               // includes <iostream>#include <cctype>using std::cin;using std::cout;// initializing static class memberint String::num_strings = 0;// static methodint String::HowMany(){    return num_strings;}// class methodsString::String(const char * s)     // construct String from C string{    len = std::strlen(s);          // set size    str = new char[len + 1];       // allot storage    std::strcpy(str, s);           // initialize pointer    num_strings++;                 // set object count}String::String()                   // default constructor{    len = 0;    str = new char[1];    str[0] = '\0';                 // default string    num_strings++;}String::String(const String & st){    num_strings++;             // handle static member update    len = st.len;              // same length    str = new char [len + 1];  // allot space    std::strcpy(str, st.str);  // copy string to new location}String::~String()                     // necessary destructor{    --num_strings;                    // required    delete [] str;                    // required}// overloaded operator methods// assign a String to a StringString & String::operator=(const String & st){    if (this == &st)        return *this;    delete [] str;    len = st.len;    str = new char[len + 1];    std::strcpy(str, st.str);    return *this;}// assign a C string to a StringString & String::operator=(const char * s){    delete [] str;    len = std::strlen(s);    str = new char[len + 1];    std::strcpy(str, s);    return *this;}// read-write char access for non-const Stringchar & String::operator[](int i){    return str[i];}// read-only char access for const Stringconst char & String::operator[](int i) const{    return str[i];}void String::stringlow(){    for(int i=0; i<len; i++)    {        if(isupper(str[i]))            str[i]=tolower(str[i]);    }}void String::stringup(){    for(int i=0; i<len; i++)    {        if(islower(str[i]))           str[i]=toupper(str[i]);    }}int String::has(char ch){    int counts=0;    for(int i=0; i<len; i++)    {        if(str[i]==ch)            counts++;    }    return counts;}// overloaded operator friendsString operator+(const String &st, const String &st2){    char * temp = new char [st.len+st2.len+1];    std::strcpy(temp, st.str);    std::strcat(temp, st2.str);    String add(temp);    return add;}bool operator<(const String &st1, const String &st2){    return (std::strcmp(st1.str, st2.str) < 0);}bool operator>(const String &st1, const String &st2){    return st2 < st1;}bool operator==(const String &st1, const String &st2){    return (std::strcmp(st1.str, st2.str) == 0);}// simple String outputostream & operator<<(ostream & os, const String & st){    os << st.str;    return os;}// quick and dirty String inputistream & operator>>(istream & is, String & st){    char temp[String::CINLIM];    is.get(temp, String::CINLIM);    if (is)        st = temp;    while (is && is.get() != '\n')        continue;    return is;}

usestring2.cpp

#include "string2.h"#include <iostream>using namespace std;int main(){    String s1(" and I am a C++ student.");    String s2="Please enter your name: ";    String s3;    cout<<s2;             //overloaded << operator    cin>>s3;              //overloaded >> operator    s2="My name is "+s3;  //overloaded =, + operators    cout<<s2<<".\n";    s2=s2+s1;    s2.stringup();        //converts string to uppercase    cout<<"The string\n"<<s2<<"\ncontians "<<s2.has('A')        <<" 'A' characters in it.\n";    s1="red";    //String(const char *)    //then String & operator=(const String &)    String rgb[3]= {String(s1), String("green"), String("blue")};    cout<<"Enter the name of a primary color for mixing light: ";    String ans;    bool success=false;    while(cin>>ans)    {        ans.stringlow();   //converts string to lowercase        for(int i=0; i<3; i++)        {            if(ans==rgb[i])   //overloaded == operator            {                cout<<"That's right!\n";                success=true;                break;            }        }        if(success)            break;        else            cout<<"Try again!\n";    }    cout<<"Bye!\n";    cin.get();    return 0;}


0 0