// strimem2.cpp // Класс String с экономией памяти // Перегружаемая операция присваивания и указатель this #include #include //для strcpy() и т. д. using namespace std; /////////////////////////////////////////////////////////// class strCount //Класс-счетчик уникальных строк { private: int count; //собственно счетчик char* str; //указатель на строку friend class String; //сделаем себя доступными //методы скрытые strCount(char* s) //конструктор с одним аргументом { int length = strlen(s); //длина строкового //аргумента str = new char[length+1]; //занять память //под строку strcpy(str, s);//копировать в нее аргументы count=1; //считать с единицы } //--------------------------------------------------------- ~strCount() //деструктор { delete[] str; } //удалить строку }; /////////////////////////////////////////////////////////// class String //класс String { private: strCount* psc; //указатель на strCount public: String() //конструктор без аргументов { psc = new strCount("NULL"); } //--------------------------------------------------------- String(char* s) //конструктор с одним аргументом { psc = new strCount(s); } //--------------------------------------------------------- String(String& S) //конструктор копирования { cout << "\nКОНСТРУКТОР КОПИРОВАНИЯ"; psc = S.psc; (psc->count)++; } //--------------------------------------------------------- ~String() //деструктор { if(psc->count==1) //если последний //пользователь, delete psc; //удалить strCount else //иначе (psc->count)--;//уменьшить счетчик } //--------------------------------------------------------- void display() //вывод String { cout << psc->str; //вывести строку cout << " (addr=" << psc << ")"; //вывести //адрес } //--------------------------------------------------------- String& operator = (String& S)//присвоение String { cout << "\nПРИСВАИВАНИЕ"; if(psc->count==1) //если последний //пользователь, delete psc; //удалить strCount else //иначе (psc->count)--;// уменьшить счетчик psc = S.psc; //использовать strCount //аргумента (psc->count)++; //увеличить счетчик return *this; //вернуть этот объект } }; /////////////////////////////////////////////////////////// int main() { String s3 = "Муха по полю пошла, муха денежку нашла"; cout << "\ns3="; s3.display(); //вывести s3 String s1,s2; //определить объекты String s1 = s2 = s3; //присваивания //вывести их cout << "\ns1="; s1.display(); cout << "\ns2="; s2.display(); cout << endl; //ожидать нажатия клавиши return 0; }