1. Klass med en dynamiskt inkluderingsfilen Klass2-1 1. Klass med en dynamiskt definitionsfilen-del 1 Klass2-2 #ifndef person #define person #include <iostream.h> #include <string.h> class Person private: char *name; int age; public: Person(void); //Defaultkonstruktorn Person(const char* namn, int alder); int getage(void) const return age; void setage(int alder) age = alder; //-Defaultkonstruktor------------------------------ Person::Person(void) name = new char[1]; name[0] = '\0'; age = 0; //-Konstruktor------------------------------------- Person::Person(const char* namn, int alder) age = alder; const char* getname() const return name; void setname(const char* namn); void print()const; ; #endif 1
1. Klass med en dynamiskt definitionsfilen -del 2 Klass2-3 1. Klass med en dynamiskt instanser av klassen Person Klass2-4 //-setname----------------------------------------- void Person::setName(const char* namn) //-print------------------------------------------- void Person::print()const cout << getname() <<", " << getage() << "år\n"; void main(void) Person kalle("kalle",23); Person *stina = new Person("Stina",24); stina->print(); nisse.setname("nisse"); nisse = *stina; delete stina; stina = new Person[3]; stina->setname("stina Ett"); stina->setage(10); (stina+1)->setname("stina Två"); (stina+1)->setage(20); stina[2].setname("stina Tre"); stina[2].setage(30); for (int i=0; i<3; i++) stina[i].print(); delete [] stina;? =>? => Programmet ger utskriften: Stina, 24 Nisse, 23 Nisse, 23 Stina Ett, 10 Stina Två, 20 Stina Tre, 30, 24 2
Grund kopiering Klass2-5 Djup kopiering Klass2-6 Person kalle("kalle",23); Djup kopiering kalle::name K a l l e \0 # Grund kopiering Bitvis kopiering! Varje databit i ursprungsobjektet kopieras till det nya objektet. I det här exemplet kopieras den adress som pekaren name pekar på och inget mera! kalle::name K a l l e \0 # Om objekten har pekare som pekar på dynamiskt allokerade data så måste den kopierings-konstruktor som finns som default definieras om så att även data fälten kopieras. Det samma gäller för likhetsoperatorn =. Det finns en default operator som fungerar bra så länge som objekten enbart innehåller statiska data men måste definieras om när dynamiska data förekommer. kalle::name K a l l e \0 # nisse::name K a l l e \0 ö < nisse::name 3
2. Klass med en dynamiskt inkluderingsfil Klass2-7 2. Klass med en dynamiskt definitionsfildel 1 Klass2-8 #ifndef person #define person #include <iostream.h> #include <string.h> class Person private: char *name; int age; public: Person(void); Person(const char* namn, int alder); Person(const Person &orginalet); //Kopieringskonst. ~Person(void); //Destruktor int getage(void) const return age; void setage(int alder) age = alder; const char* getname() const return name; void setname(const char* namn); Person& operator=(const Person &orginalet); void print()const; ; #endif //-Konstruktor------------------------------------- Person::Person(void) name = new char[1]; name[0] = '\0'; age = 0; //-Konstruktor------------------------------------- Person::Person(const char* namn, int alder) age = alder; //-Kopieringskonstruktor--------------------------- Person::Person(const Person& orginalet) name = new char[strlen(orginalet.name)+1]; strcpy(name,orginalet.name); age = orginalet.age; //-Destruktor-------------------------------------- Person::~Person(void) 4
2. Klass med en dynamiskt definitionsfildel 2 Klass2-9 2. Klass med en dynamiskt instanser av klassen Person Klass2-10 //-setname----------------------------------------- void Person::setName(const char* namn) void main(void) Person kalle("kalle",23); Person *stina = new Person("Stina",24); //-operator=--------------------------------------- Person& Person::operator=(const Person &orginalet) if (&orginalet!= this) if (strlen(name)!= strlen(orginalet.name)) name = new char[strlen(orginalet.name)+1]; strcpy(name,orginalet.name); age = orginalet.age; return *this; //-print------------------------------------------- void Person::print()const cout << getname() <<", " << getage() << "år\n"; stina->print(); nisse.setname("nisse"); nisse = *stina; delete stina; stina = new Person[3]; stina->setname("stina Ett"); stina->setage(10); (stina+1)->setname("stina Två"); (stina+1)->setage(20); stina[2].setname("stina Tre"); stina[2].setage(30); for (int i=0; i<3; i++) stina[i].print(); delete [] stina; Programmet ger utskriften: Stina, 24 Nisse, 23 Stina Ett, 10 Stina Två, 20 Stina Tre, 30 Stina, 24! =>! => 5
Klass2-11 'X VND NXQQD«'X VND NXQQD I UNODUD EHJUHSSHQ JUXQG RFK GMXS NRSLHULQJ 'X VND NXQQD VNULYD NODVVHU VRP DQYlQGHU G\QDPLVNW DOORNHUDGH IlOW 'X VND YHWD YDG HQ GHVWUXNWRU lu I U QnJRW 'X VND NXQQD VNULYD HQ NRSLHULQJV NXQVWUXNWRU 'X VND NXQQD YHUODJUD WLOOGHOQLQJVRSHUDWRUQ 6