C++ String class, overloaded assignment and copy constructor

Description

C++ String class, overloaded assignment and copy constructor

#include <iostream>
#include <cstring>                //for strcpy(), etc.
using namespace std;
class strCount                    //keep track of number
{                              //of unique strings
private://from   w  ww. jav  a  2  s . c  om
    int count;                  //number of instances
    char* str;                  //pointer to string
    friend class String;        //make ourselves available
    //member functions are private
    strCount(char* s)           //one-arg constructor
    {
        int length = strlen(s);  //length of string argument
        str = new char[length+1];  //get memory for string
        strcpy(str, s);          //copy argument to it
        count=1;
    }
    ~strCount()                 //destructor
    { delete[] str; }        //delete the string
};
class String                      //String class
{
    private:
        strCount* psc;              //pointer to strCount
    public:
        String()                    //no-arg constructor
        { psc = new strCount("NULL"); }
        String(char* s)             //1-arg constructor
        { psc = new strCount(s); }
        String(String& S)           //copy constructor
        {
            psc = S.psc;
            (psc->count)++;
        }
    ~String()                   //destructor
    {
       if(psc->count==1)        //if we are its last user,
          delete psc;           //   delete our strCount
       else                     //   otherwise,
          (psc->count)--;       //   decrement its count
    }
    void display()              //display the String
    {
       cout << psc->str;                 //print string
       cout << " (addr=" << psc << ")";  //print address
    }
    void operator = (String& S) //assign the string
    {
        if(psc->count==1)        //if we are its last user,
           delete psc;           //   delete our strCount
        else                     //   otherwise,
           (psc->count)--;       //   decrement its count
        psc = S.psc;             //use argument's strCount
        (psc->count)++;          //increment its count
     }
};
int main()
{
      String s3 = "this is a test.";
      cout << "\ns3="; s3.display();
      String s1;                       //define String
      s1 = s3;                         //assign it another String
      cout << "\ns1="; s1.display();
      String s2(s3);                   //initialize with String
      cout << "\ns2="; s2.display();
      cout << endl;
      return 0;
}



PreviousNext

Related