Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT 2013 1 / 26



Relevanta dokument
Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11)

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

Operatoröverlagring. endast operatorsymboler definierade i C++ kan överlagras = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && > ->*, [ ] ( )

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

Tillämpad programmering

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Del3 Klassanvändning, operatorer och pekare Ämnesområden denna föreläsning:

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Programmering A. Johan Eliasson

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

TDIU01 - Programmering i C++, grundkurs

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

TDIU01 - Programmering i C++, grundkurs

TDIU01 Programmering i C++

Synlighet. Namespace Scope-operatorn Klasser Vänner

Dynamisk bindning och polymorfism

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Kapitel 3. Synlighet. Kapitel 3 - Klassanvändning, operatorer och pekare. Synlighet

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

TDIU20 - Objektorienterad programmering i c++ - föreläsning 3

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Java, klasser, objekt (Skansholm: Kapitel 2)

Parameteröverföring. Exempel. Exempel. Metodkropp

Programmering i C++ EDA623 Mallar. EDA623 (Föreläsning 12) HT / 29

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Klasser. Kapitel 2. Kapitel 2 - Klasser, medlemmar och arv. Klasser. Klasser Medlemmar Arv

Klassdeklaration. Metoddeklaration. Parameteröverföring

Programsystemkonstruktion med C++

TDDC76 - Programmering och Datastrukturer

Funktionens deklaration

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Innehåll. Pekare Syntax

Föreläsning 3-4 Innehåll

Programmering B med Visual C

Föreläsning 5-7 Operatoröverlagring

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

Objekt och klasser - Introduktion

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

C++-programmets beståndsdelar

Föreläsning 5-6 Innehåll

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

TDDC76 - Programmering och Datastrukturer

1 Datorn som miniräknare. 1.1 Räkneoperationer. 1.2 Variabler

Innehåll. Pekare Exempel

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursassistent: Mårten Björkman,

OOP Objekt-orienterad programmering

Föreläsning REPETITION & EXTENTA

Tillämpad programmering

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Innehåll. Pekare Exempel

Objekt och klasser - Introduktion. Objekt. SparKonto.java 2. SparKonto.java 1. Konton.java. Ett objekt har: Ett bankkonto

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

TDDC76 Programmering och datastrukturer

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

C++ Objektorientering - Klasser. Eric Elfving

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Det objektorienterade synsättet. Objekt. Datorprogrammet kan uppfattas som en slags modell av den verklighet programmet skall samverka med.

Objektorienterad programmering i Java

Högskolan Dalarna sid 1 av 5 Data-avdelningen Hans-Edy Mårtensson

TDDC76 - Programmering och Datastrukturer

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

Objektorienterad programmering

SMD 134 Objektorienterad programmering

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Innehåll. 1 Typdeklarationer och typomvandling 2 Resurshantering. 3 Objektorientering, kort repetition. 4 Klasser

Föreläsning 3: Booleans, if, switch

Typkonvertering. Java versus C

Föreläsning 2, vecka 8: Repetition

ÖREBRO UNIVERSITET. Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Generiska konstruktioner. Kursbokens kapitel 13

Repetition C-programmering

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

SP:PROG3 HT12 Tenta

Tentamen OOP

Det finns många flaggor till g++,

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

Vad är en klass? Övning 2. Konstruktorer. ffl copy-konstruktorn tar en instans av klassen som. ffl default-konstruktorn tar inga argument och kan

1 Namnkontroll (NameControl)

Classes och Interfaces, Objects och References, Initialization

F4. programmeringsteknik och Matlab

Transkript:

Programmering i C++ EDA623 Mer om klasser EDA623 (Föreläsning 6) HT 2013 1 / 26

Mer om klasser Innehåll Konstanta objekt Statiska medlemmar Pekaren this Vänner (friends) Överlagring av operatorer EDA623 (Föreläsning 6) HT 2013 2 / 26

Konstanta objekt Exempel: Bankkonto Hantering av konstant objekt const Bankkonto std_konto("0",0), *pk; std_konto.insattning(1000); // Fel std_konto.kontobesked(); // Fel!? std_konto.uttag(250); // Fel pk = &std_konto; // pk pekare till konstant objekt! pk->uttag(4500); // Fel EDA623 (Föreläsning 6) HT 2013 3 / 26

Konstanta objekt Exempel: Bankkonto Lägg till const i deklarationen (och i definitionen!) av medlemsfunktionen kontobesked(): class Bankkonto { public: //... void kontobesked() const; //... ; //... dekl. som på föregående bild std_konto.kontobesked(); // Ok nu! EDA623 (Föreläsning 6) HT 2013 4 / 26

Statiska medlemmar Statiska medlemmar: Delas mellan alla objekt i klassen Exempel: Bankkonto class Bankkonto { public: //... static void andra_ranta(float r) {ranta=r; private: //... static float ranta; // I.cpp float Bankkonto::ranta = 2; // Ändra ränta på klass-nivå (utan ngt obj.) Bankkonto::andra_ranta(2.5); EDA623 (Föreläsning 6) HT 2013 5 / 26

Pekaren this Självreferens För att referera till sig själv kan ett objekt använda den dolda pekaren this (motsvarande referensen this i Java). Typiskt exempel när denna behövs // I klassdefinitionen Vektor& inc(); // Medlemsfunktion som returnerar det // aktuella objektet inkrementerat Vektor& Vektor::inc() { for (int i=0; i<ant; i++) p[i]++; return *this; // this är ju pekare EDA623 (Föreläsning 6) HT 2013 6 / 26

Vänner Funktioner med VIP-kort dvs funktioner med full access in i en klass utan att vara medlem Deklaration i klassen Vektor friend void kvadrera(vektor& v); Definition utanför klassen Vektor void kvadrera(vektor& v) { for (int i=0; i<v.ant; i++) v.p[i] *= v.p[i]; Även medlemsfunktioner från andra klasser eller t.o.m. hela klasser kan vara vänner EDA623 (Föreläsning 6) HT 2013 7 / 26

Kan göras för de flesta operatorer som är definierade för de inbyggda (primitiva) datatyperna. Undantag: sizeof..* ::?: kan inte överlagras men det kan t.ex. new delete new[] delete[] + - * / % ^ & ~! = < > << >>!= == += *=... && ++ -- -> ->* () [] EDA623 (Föreläsning 6) HT 2013 8 / 26

Överlagring av operatorer görs med syntaxen returtyp operator (parametrar) för någon operator t.ex. == eller + Exempel: Komplexa tal class Komplex { public: Komplex(float r, float i) : re(r), im(i) { Komplex operator+(const Komplex& rhs) const; Komplex operator*(const Komplex& rhs) const; // De andra medlemsfunktionerna som t.ex. // operator-, operator/, get_re, set_re... private: float re, im; ; EDA623 (Föreläsning 6) HT 2013 9 / 26

Överlagrade operatorer i användning: Exempel: Komplexa tal Komplex a = Komplex(1.2, 3.4); Komplex b = Komplex(2.3, 1); Komplex c = b; a = b + c; // a = b.operator+(c); b = b + c * a; c = a * b + Komplex(7, 4.5); EDA623 (Föreläsning 6) HT 2013 10 / 26

Alternativ implementering mha friend Exempel: Komplexa tal //Deklaration i klassen Komplex friend Komplex operator+(const Komplex& l, const Komplex& r); friend Komplex operator*(const Komplex& l, const Komplex& r); //... a = b + c; // a = operator+(b,c); EDA623 (Föreläsning 6) HT 2013 11 / 26

Definition av operatorn + på två sätt Som medlemsfunktion Komplex Komplex::operator+(const Komplex& rhs)const{ Komplex temp; temp.re = re + rhs.re; temp.im = im + rhs.im; return temp; Som vänfunktion Komplex operator+(const Komplex& l, const Komplex& r){ Komplex temp; temp.re = l.re + r.re; temp.im = l.im + r.im; return temp; // Att denna är friend syns bara i deklarationen EDA623 (Föreläsning 6) HT 2013 12 / 26

Definition av operatorn + på två sätt Som medlemsfunktion Komplex Komplex::operator+(const Komplex& rhs)const{ Komplex temp; temp.re = re + rhs.re; temp.im = im + rhs.im; return temp; Som vänfunktion så att högra operanden inte kan ändras så att vänstra operanden inte kan ändras Komplex operator+(const Komplex& l, const Komplex& r){ Komplex temp; temp.re = l.re + r.re; temp.im = l.im + r.im; return temp; // Att denna är friend syns bara i deklarationen EDA623 (Föreläsning 6) HT 2013 13 / 26

Puzzle Corner Objekt som returvärden Vi kan inte returnera referenser till objekt som skapas i en funktion. Hur ineffektivt är det att istället returnera kopior av objekten? Vad skrivs ut av programmet nedan? class C { public: C() : a(0), b(0) { cout << "A C was made.\n"; C(const C& ac) : a(ac.a),b(ac.b) {cout << "A copy was made.\n"; private: int a, b; ; C f() { return C(); int main() { cout << "Hello World!\n"; C obj = f(); EDA623 (Föreläsning 6) HT 2013 14 / 26

Puzzle Corner Svar Som programmet är skrivet anropas default-konstruktorn en gång (C()) och copy-konstruktorn två gånger (vid initialiseringen av den anonyma returvariabeln i f() och vid initialiseringen av variablen obj). Vad som faktiskt skrivs ut beror på hur bra kompilatorn är på optimera! Både Visual Studio och gcc (CodeBlocks) optimerar bort bägge anropen av copy-konstruktorn och ger följande utskrift: Hello World! A C was made. Andra kompilatorer kan ge andra svar EDA623 (Föreläsning 6) HT 2013 15 / 26

Binära operatorer: Jämförelseoperatorn == Deklarationen (i klassdefinitionen av Vektor) bool operator==(const Vektor& v) const; Definitionen (utanför klassdefinitionen) bool Vektor::operator==(const Vektor& v) const { if (ant!=v.ant) return false; for (int i=0; i<ant; i++) if (p[i]!= v.p[i]) return false; return true; // v1 == v2 tolkas som v1.operator==(v2) EDA623 (Föreläsning 6) HT 2013 16 / 26

Binära operatorer: Operatorn += Deklarationen (i klassdefinitionen av Vektor) const Vektor& operator+=(const Vektor& v); Definitionen (utanför klassdefinitionen) const Vektor& Vektor::operator+=(const Vektor& v) { assert(ant == v.ant); for (int i=0; i<ant; i++) p[i] += v.p[i]; return *this; // Referens till konstant som retur för att // t.ex. (v1 += v2) += v3 ej ska kunna ske EDA623 (Föreläsning 6) HT 2013 17 / 26

Binära operatorer: Operatorn + Deklarationen (i klassdefinitionen av Vektor) Vektor operator+(const Vektor& v) const; Definitionen (utanför klassdefinitionen) Vektor Vektor::operator+(const Vektor& v) const { assert(ant == v.ant); Vektor temp(*this); temp += v; return temp; // Ingen referens som returvärde (för att undvika // kvardröjande pekare (dangling pointers)) EDA623 (Föreläsning 6) HT 2013 18 / 26

Binära operatorer: Variant av += med heltal som höger operand Deklarationen (i klassdefinitionen av Vektor) const Vektor& operator+=(int d); Definitionen (utanför klassdefinitionen) const Vektor& Vektor::operator+=(int d) { for (int i=0; i<ant; i++) p[i] += d; return *this; EDA623 (Föreläsning 6) HT 2013 19 / 26

Binära operatorer: Variant av + med heltal som höger operand Deklarationen (i klassdefinitionen av Vektor) Vektor operator+(int d) const; Definitionen (utanför klassdefinitionen) Vektor Vektor::operator+(int d) const { Vektor temp(*this); temp += d; return temp; EDA623 (Föreläsning 6) HT 2013 20 / 26

Binära operatorer: Variant av + med heltal som vänster operand Problem: Kan inte använda medlemsfunktion (varför?)! Deklarationen (Obs! Utanför klassdefinitionen av Vektor) Vektor operator+ (int d, const Vektor& v); Definitionen (Obs! Ingen medlemsfunktion!) Vektor operator+ (int d, const Vektor& v) { return v + d; // Utnyttjar andra +-op.! Alt. dekl. med friend i klassdefinitionen friend Vektor operator+ (int d, const Vektor& v); // Detta behövs dock ej i detta fall! EDA623 (Föreläsning 6) HT 2013 21 / 26

Unär operator: Teckenskifte Deklarationen (i klassdefinitionen av Vektor) Vektor operator- () const; Definitionen (utanför klassdefinitionen) Vektor Vektor::operator- () const { Vektor temp(*this); //Temp. kopia for (int i=0; i<ant; i++) temp.p[i] = -temp.p[i]; return temp; EDA623 (Föreläsning 6) HT 2013 22 / 26

Unära operatorer: Ökningsoperatorerna ++ Deklarationen (i klassdefinitionen av Vektor) const Vektor& operator++ (); // prefix (++v) Vektor operator++ (int); // postfix (v++) // Dummy-parameter i postfix för att se skillnad Definitionen (utanför klassdefinitionen) const Vektor& Vektor::operator++ () { // prefix return (*this) += 1; // Returnera inkrementerad Vektor Vektor::operator++ (int) { // postfix Vektor temp(*this); // Kopia av detta objekt (*this) += 1; return temp; // Returnera oinkrementerad kopia EDA623 (Föreläsning 6) HT 2013 23 / 26

Tilldelningsoperatorn = Deklarationen (i klassdefinitionen av Vektor) const Vektor& operator=(const Vektor& v); Definitionen (utanför klassdefinitionen) const Vektor& Vektor::operator=(const Vektor& v) { if (this!= &v) {//Uteslut tilld. till sig själv delete[] p; // Städa bort gammal bråte ant = v.ant; p = new int[ant]; // Fixa plats för ny vektor for (int i=0; i<ant; i++) p[i] = v.p[i]; return *this; EDA623 (Föreläsning 6) HT 2013 24 / 26

Indexeringsoperatorn [] Deklarationen (i klassdefinitionen av Vektor) int& operator[] (int i); int operator[] (int i) const; // Se nedan! Definitionen (utanför klassdefinitionen) int& Vektor::operator[] (int i) { assert(i>=0 && i<ant); return p[i]; // Returnerar en referens // Kan anv. i v.l. i en tilldelning // Överlagrad av variant för konstanta objekt int Vektor::operator[] (int i) const { assert(i>=0 && i<ant); return p[i]; // Returnerar en kopia // Kan ej anv i v.l. i en tilldelning! EDA623 (Föreläsning 6) HT 2013 25 / 26

Exempel på friend-deklarerad operator: << (#include <ostream>) Deklarationen (i klassdefinitionen av Vektor) friend ostream& operator<<(ostream& o, const Vektor& v); Definitionen (Obs! Ingen medlemsfunktion) ostream& operator<<(ostream& o, const Vektor& v) { o << { ; if (v.ant > 0) o << v.p[0]; for (int i=1; i<v.ant; i++) o << ", " << v.p[i]; o << ; return o; EDA623 (Föreläsning 6) HT 2013 26 / 26