/* OPERATO2.CPP - malli copy construktorin ja h„vitt„j„n tutkimiseen */ #include #include /* Kokeile seuraavia: 1) Yhteenlaskussa on tilap„inen muuttuja t 2) ei ole tilap„ist„ muuttujaa t 3) sijoitus on tyyppi„ cPaikka & 4) sijoitus on tyyppi„ cPaikka 5) sijoitus on tyyppi„ void 6) yhteenlaskun parametri on tyyppi„ cPaikka eik„ cPaikka & palauta t„m„n j„lkeen tyypiksi takaisin cPaikka & 7) lis„„ p„„ohjelmaan sijoitus p4 = p3 = p2 = p1 8) edellinen ketjusijoitus sek„ sijoitus tyyppi„ cPaikka 9) kokeile viel„ kommentoida copy contructori pois kun tilap„inen yhteenlaskumuuttuja on k„yt”ss„. Miten selit„t tilanteen? Kuinka monta tilap„ist„ (ei itse m„„ritelty„) oliota syntyy kussakin tapauksessa + operaatiosta, sijoitusoperaatiosta ja uhteens„. Eli normaalisti laskusta p4=p1+p2 k„ytt„j„ olettaa 3 olion osallistuvan laskutoimitukseen. Jos laskun aikana on esim. k„yt”ss„ 6 oliota, on n„ist„ yhteens„ 3 "ylim„„r„ist„" (joista 2 voi olla +:n takia ja 1 =:n takia). T„yt„ tuloksista alla oleva taulukko ja tee p„„telm„ mik„ on paras tapa hoitaa sijoitus ja mik„ yhteenlasku. Ent„ jos laskuoperaatio on matriisilasku, jossa v„ltt„m„tt„ tarvitaan apumuuttuja? ---------------------------- | | p4=p1+p2 |p4=p1+p2+p3| | | + | = |yht| + | = |yht| |--+---+---+---+---|---|---| |1)| | | | | | | |2)| | | | | | | |3)| | | | | | | |4)| | | | | | | |5)| | | | | | | |6)| | | | | | | |7)| | | | | | | |8)| | | | | | | |9)| | | | | | | ---------------------------- */ class cPaikka { int x,y; char nimi[20]; static int paikkoja; void nimea(char *s="") { // Oletuksena pisteiden m„„r„ + this -osoite paikkoja++; if ( s[0] ) sprintf(nimi,"%02d-%s",paikkoja,s); else sprintf(nimi,"%02d-%04p",paikkoja,this); } void tulosta() const { printf("(%d,%d) -- %-10.9s ",x,y,nimi); } void rivi(char *s,char *v="",cPaikka *p=NULL) const { printf("%-20s : ",s); if ( p ) { p->tulosta(); printf(" %-3s ",v); } tulosta(); if ( v[0] == 'j' ) printf(" j„ljell„ %d",paikkoja); else printf("%s%s%s",v,v,v); printf("\n"); } public: cPaikka() {x=0; y=0; nimea(); rivi("Empty constructor"); } cPaikka(int ix,int iy,char *s="") { x = ix; y=iy; nimea(s); rivi("Norm.constructor"); } #if 1 cPaikka(cPaikka &p) { x=p.x; y=p.y; nimea(); rivi("Copy constructor","->",&p); } #endif ~cPaikka() {paikkoja--; rivi("H„vitt„j„","j"); } cPaikka operator+(cPaikka &p); cPaikka &operator=(cPaikka &p); }; cPaikka cPaikka::operator+(cPaikka &p) { #if 1 rivi("Yhteenlasku apum"," +",&p); cPaikka t(0,0,"t");; t.x = x + p.x; t.y = y + p.y; return t; #else rivi("Yhteenlasku ei apum"," +",&p); return cPaikka( x + p.x, y+ p.y ); #endif } cPaikka &cPaikka::operator=(cPaikka &p) { rivi("Sijoitus","->",&p); x = p.x; y = p.y; return *this; } int cPaikka::paikkoja = 0; int main(void) { printf("---------------------------------------------------------------\n"); cPaikka p1(2,2,"p1"),p2(1,4,"p2"),p3(2,1,"p3"),p4(0,0,"p4"); printf("p4 = p1 + p2:--------------------------------------------------\n"); p4 = p1 + p2; #if 0 printf("p4 = p1 + p2 + p3:---------------------------------------------\n"); p4 = p1 + p2 +p3; #endif printf("Ohjelman loppu:------------------------------------------------\n"); return 0; }