/* COPYCONS.CPP - copy constructor */ #include #include class cJono { int max_pit; char *s; // Yksinkertaistamiseksi tarkistukset puuttuvat! public: cJono(int koko=255) { s = new char[koko+1]; s[0]=0; max_pit = koko; printf("Oletusrakentaja: "); tulosta(); } cJono(const char *is) { max_pit = strlen(is); s = new char[max_pit+1]; strcpy(s,is); printf("Rakentaja: "); tulosta(); } cJono(const cJono &j) { max_pit = j.max_pit; s = new char[max_pit+1]; strcpy(s,j.s); printf("Copy constructor: "); tulosta(); } ~cJono() { printf("H„vitt„j„: "); tulosta(); if ( max_pit ) delete [] s; else printf("Oli jo tuhottu!\n"); max_pit=0; } #define ASSIGN 1 #if ASSIGN cJono &operator=(const cJono &j) { if ( &j == this ) { printf("Ei sijoitusta itselle!\n"); return *this; } printf("Kopiointi:"); tulosta(); j.tulosta(); if ( max_pit < j.max_pit ) { printf("Tehd„„n tilaa isommalle!\n"); if ( max_pit ) delete [] s; s = new char[j.max_pit+1]; max_pit = j.max_pit; } strcpy(s,j.s); return *this; } #endif void tulosta() const { printf("Osoitteet: olio %p, jono %4p Jono %s\n",this,s,s); } friend int vertaa(cJono j1, cJono j2); friend void ftulosta(cJono j); }; int vertaa(cJono j1, cJono j2) { printf("Aliohjelmassa vertaa!\n"); j1.tulosta(); j2.tulosta(); return strcmp(j1.s,j2.s); } void ftulosta(cJono j) { printf("Aliohjelmassa ftulosta!\n"); j.tulosta(); printf("Pois aliohjelmassa ftulosta!\n"); } int main(void) { printf("\n---------------------------------------------------\n"); cJono j1("j1"); j1.tulosta(); #if EQ { cJono j2("Kissa"); j2.tulosta(); j2 = j1; j2.tulosta(); } j1.tulosta(); #endif ftulosta(j1); #if 0 printf("Menossa aliohjelmaan ftulosta:\n"); ftulosta(j1); printf("Menossa aliohjelmaan tulosta:\n"); j1.tulosta(); printf("Vertailu:\n"); int i = vertaa(j1,j2); printf("Vertailun tulos %d\n",i); #endif return 0; }