Удосконалена програма роботи з типом String
Використовуючи вказівник this можна переробити функцію operator=() в програмі 22.17 і змусити її повертати резултат за посиланням. Таким чином можна здійснювати множинні присвоювання для класу String, наприклад:
а1=а2=а3
В той же час, ми уникнемо і створення хибних об’єктів у вигляді копій для створення результату, як це було, коли повернення здійснювалося за значенням.
Далі приведений лістінг програми 22.21
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<bios.h>
#include<string.h>
/////////////////
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
{private:
strCount* psc;
public:
String()//конструктор без аргументів
{psc=new strCount(“NULL”);}
//-------
String(char* s)//конструктор з 1 аргументом
{psc=new strCount(s);}
//-----------
String(String& S) //конструктор копіювання
{psc=S.psc;
(psc->count)++;}
//----------
~String() //деструктор
{if(psc->count==1)
delete psc;
else
(psc->count)--;
}
//----------
void display()
{cout<<psc->str;
cout<<” (addr=”<<psc<<”)”; //виведення адреси
}
//-----------
String& operator=(String& S)
{cout<<”\nПрисвоювання”;
if(psc->count==1) //if last
delete psc;
else
(psc->count)--;
psc=S.psc;
(psc->count)++;
return *this;
}
};
//////////////
int main()
{clrscr();
String s3=”Будь-яка пробна фраза”;
cout<<”\ns3=”;s3.display();
String s1,s2;
s1=s2=s3;
cout<<”\ns1=”;s1.display();
cout<<”\ns2=”;s2.display();
cout<<endl;
bioskey(0);
return 0;
}
Програма 22.21
Тепер описувачем оператору присвоювання є
String& operator=(String& S)
і програма повертає вказівник на this.
Слід відмітити, що вказівник this не можна використовувати у статичних методах, оскільки вони не асоційовані з конкретним об’єктом.
Дата добавления: 2015-08-26; просмотров: 588;