#include #include #include "Person.h" using namespace std; Person::Person(){ name=new char[1]; *name='\0'; age=-1; } Person::Person(const Person& P): name(NULL), age(P.age) { name=new char[strlen(P.name)+1]; strcpy(name,P.name); } Person& Person::operator= (const Person& P){ if(this!=&P){ delete[] name; name=NULL; name=new char[strlen(P.name)+1]; strcpy(name,P.name); age=P.age; } return *this; } Person::~Person(){ delete[] name; } istream& operator>> (istream& is, Person& P){ // Оператор за въвеждане от подотк char buffer[31]; // Правим буфер в който ще четем is.get(buffer,31); // Четем буфера int buffered=strlen(buffer); // Инициализираме променлива която да ни казва колко delete[] P.name; // Освобождаваме старата памет заделена за име P.name=new char[buffered+1]; // символа сме прочели до сега и заделяме памет за толкова strcpy(P.name,buffer); // копираме буфера в заделеното място while (strlen(buffer)>=30){ // Докато в буфера имамем записани максимум байта (30) is.get(buffer,30); // продължаваме да четем в буфера buffered+=strlen(buffer); // Уевеличаваме броя на прочетените съмволи char* name1= new char[buffered+1]; // с дължината на буфера и заделяме толкова памет strcpy(name1,P.name); // В новозаделента памет кпираме досега почетената част от името strcat(name1,buffer); // и към него конкатенираме тукощо буферираната част delete[] P.name; // Освобождаваме старата памет P.name=name1; // и на нейно място записваме новополученото име } is>>P.age; // Четем възрастта is.getline(buffer,31); // Изчистваме редеда на потока // Ако не го изчистим символа за нов ред остава // в потока и при следващо четене първо ще прочетем него return is; // Връщаме модифицирания поток } ostream& operator<< (ostream& os,const Person& P){ // оепратор за извеждане на поток os< ++a (префиксен оператор връща референция) age++; // Увеличаваме възрастта и връщаме return *this; // и връщаме референция към вечепромененя обект } Person Person::operator++(int){ // <-> a++ (постфиксен оператор връща копие) Person a=*this; // Правим копие на обекта operator++(); // инкрементираме го return a; // и после връщаме копието } Person::operator bool () const { // <-> (bool)a оператор за ковертиране от Person към bool // като връща true, ако човека е реален (има име и return age>=0 && strlen(name); // е с възраст неотрицателна възраст) }