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

Relevanta dokument
Innehåll. Pekare Exempel

Innehåll. Pekare Exempel

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

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

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

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

Innehåll. 1 volatile. 2 Kuriositeter. 3 Klasser och arv. 4 Råd och tumregler. 5 Mer om standard-containers. Trigraphs

Innehåll. Konstruktorer vid arv Regler för basklassens konstruktor. Konstruktorer vid arv. Konstruktorer vid arv. Konstruktorer vid arv

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

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (casting) Implicita Typomvandlingar

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

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

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

TDIU01 Programmering i C++

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 Operatoröverlagring. 5 In- och utmatning. 6 namnrymder (namespace)

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

Dynamisk bindning och polymorfism

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 In- och utmatning. 5 Operatoröverlagring. 6 namnrymder (namespace)

TDDC76 - Programmering och Datastrukturer

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

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

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

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

Java, klasser, objekt (Skansholm: Kapitel 2)

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

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

Objektorienterad programmering

Föreläsning 5-6 Innehåll

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

Tillämpad programmering

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

TDDC76 - Programmering och Datastrukturer

Funktionens deklaration

Innehåll. Resource handles. Resurshantering. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 7. Resurshantering, Felhantering

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

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

DAT043 - Föreläsning 7

TDIU01 - Programmering i C++, grundkurs

Övningar Dag 2 En första klass

Innehåll. Pekare. Datatyper Pekare, Arrayer och Referenser. Pekare Syntax. Pekare Syntax, operatorer. 4. Standard-containers. Pekare och arrayer

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

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

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

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Classes och Interfaces, Objects och References, Initialization

Introduktion till arv

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

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

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

Skapa, kopiera och destruera klassobjekt

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

Innehåll. Pekare Syntax

Tentamen EDAF30 Programmering i C++

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

C++ Objektorientering - Klasser. Eric Elfving

Tentamen EDAF30 Programmering i C++

Synlighet. Namespace Scope-operatorn Klasser Vänner

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

Nedan skapar vi klassen Person innehållande datamedlemmar för förnamn, efternamn, ålder, längd och vikt:

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

Innehåll. Exceptionella händelser (exceptions, undantag ) Felhantering Tre nivåer av felhantering: Nivå 2: exceptions (eller returvärde)

Innehåll. Parametriserade typer. Klassmallar. Klassmallen Vektor Konstructor med std::initializer_list. Klassmallen Vektor Medlemsfunktioner

1 Namnkontroll (NameControl)

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

Programsystemkonstruktion med C++

TDIU01 - Programmering i C++, grundkurs

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Innehåll. 1 Funktionsmallar. 2 Pekare och konstanter. 3 Typomvandlingar. struct Name { string s; //... };

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

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Modeller, Objekt och Klasser

tentaplugg.nu av studenter för studenter

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

TDDC76 - Programmering och Datastrukturer

Arv bakgrund (kap. 9)

Innehåll. 1 Funktionsmalllar. 2 Klassmallar. struct Name { string s; //... }; const Name & minimum ( const Name & a, const Name & b) { if(a.s < b.

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

allokeras på stacken dynamiskt new delete

Tommy Färnqvist, IDA, Linköpings universitet

Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

TDDC76 - Programmering och Datastrukturer

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Föreläsning 4 Tillägg till C-syntaxen

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

TDDC76 Programmering och datastrukturer

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Klasshierarkier - repetition

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

Klasser och objekt, referenser Grundkurs i programmering med Python

Typkonvertering. Java versus C

Malmö högskola 2007/2008 Teknik och samhälle

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Lösningsförslag övning 2.

JAVA Mer om klasser och objektorientering

Det finns många flaggor till g++,

(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

Transkript:

Innehåll EDAF30 Programmering i C++ 3. Mer om klasser. Funktionsanrop Sven Gestegård Robertz Datavetenskap, LTH 2017 1 Klasser pekaren this const för objekt och medlemmar Kopiering friend inline 2 Funktionsanrop Referens- eller värdeanrop, tumregler 3. Mer om klasser. Funktionsanrop 2/1 Användardefinierade typer Kategorier Användardefinierade typer Konkreta klasser Konkreta klasser Abstrakta klasser Klasshierarkier En konkret typ kan användas på samma sätt som en inbyggd typ dess representation ingår i dess definition, Objekt kan placeras på stacken (d v s i lokala variabler) i andra objekt i statiskt allokerat minne (i globala variabler ) kopieras tilldelning av variabel värdeanrop av funktion refereras direkt (inte bara genom referenser eller pekare) initieras direkt och fullständigt (med en konstruktor) Klasser 3. Mer om klasser. Funktionsanrop 3/41 Klasser 3. Mer om klasser. Funktionsanrop 4/41 Två sätt att skriva initiering av medlemmar Med initierarlista i konstruktorn. class Bar int value ; bool flag ; Bar (int v, bool b) : value v, flag b ; Medlemmar kan ha en default initializer, i C++11: class Foo Foo () Foo (int v) : value v int value 0; bool flag = false ; ; Om en medlem både har default initializer och initierare i konstruktorn finns, används initieraren i konstruktorn. Klasser : 3. Mer om klasser. Funktionsanrop 5/41 Defaultkonstruktor Svarar mot en konstruktor utan parametrar Får ha parametrar med defaultvärden Definieras automatiskt om inte någon konstruktor alls är definierad (i deklaration: =default, kan ej anropas om =delete) Defaultkonstruktor med initierarlista. class Bar Bar(int v=100, bool b= false ) : value v, flag b int value ; bool flag ; ; Anrop av defaultkonstruktor kan inte göras med tomma parenteser. Klasser : 3. Mer om klasser. Funktionsanrop 6/41

Defaultkonstruktor och parenteser Default-konstruktor och initiering Bar b1; Bar b2 ; Bar be (); // kompileringsfel! " most vexing parse " Bar b3 (25); // OK Bar * bp1 = new Bar ; Bar * bp2 = new Bar ; Bar * bp3 = new Bar (); // OK automatiskt genererad default-konstruktor (=default) initierar inte alltid medlemmar globala variabler initieras till 0 (motsv) lokala variabler initieras inte Betyder nåt annat än i Java struct A int x; ; int i; // i initieras till 0 A a; // a.x initieras till 0 int main () int j; // j initieras inte int k = int (); // k initieras till 0 int l; // l initieras till 0 A b; // b.x initieras inte A c = A(); // c.x initieras till 0 A d; // d.x initieras till 0 använd alltid initierarlista implementera alltid default-konstruktor (eller =delete) Klasser : 3. Mer om klasser. Funktionsanrop 7/41 Klasser : 3. Mer om klasser. Funktionsanrop 8/41 Default-konstruktor Delegering (C++11) Default-värden på parametrar Om en konstruktor kan anropas utan argument, är det en default-konstruktor. class KomplextTal KomplextTal ( float x=1 ): re(x),im (0) ; ger samma default-konstruktor som den explicita KomplextTal (): re 1, im 0 I C++11 kan en konstruktor anropa en annan (som this(...) i Java). struct Test int val; bool bar; ; Test (int v, bool b) :valv,barb Test (int v) : Test (v, true ) ; // delegering Test () : Test (0, false ) ; // delegering Klasser : 3. Mer om klasser. Funktionsanrop 9/41 Klasser : 3. Mer om klasser. Funktionsanrop 10/41 Pekaren this Självreferens Konstanta objekt const betyder jag lovar att inte ändra denna I en medlemsfunktion finns den implicita pekaren this, som pekar på objektet som funktionen anropades för. (jfr. this i Java). Objekt (variabler) kan vara deklarerade const jag lovar att inte ändra värdet på variabeln Mer om detta när vi studerat pekare Referenser kan vara deklarerade const jag lovar att inte ändra värdet på variabeln som refereras en const& kan referera till ett icke-const objekt vanligt för funktionsparametrar Medlemsfunktioner kan vara deklarerade const jag lovar att funktionen inte ändrar objektets tillstånd tekniskt: implicit deklaration const T* const this Klasser : pekaren this 3. Mer om klasser. Funktionsanrop 11/41 Klasser : const för objekt och medlemmar 3. Mer om klasser. Funktionsanrop 12/41

Konstanta objekt Exempel const objekt och const funktion class Point Point (int xi, int yi) :xxi,yyi int get_x () const return x; int get_y () const return y; void set_x (int xi) x = xi ; void set_y (int yi) y = yi ; int x; int y; ; void example ( Point & p, const Point & o) p. set_y (10); cout << "p: " << p. get_x () << "," << p. get_y () << endl ; o. set_y (10); cout << "o: " << o. get_x () << "," << o. get_y () << endl ; passing const Point as this argument discards qualifiers Konstanta objekt Exempel Notera const i deklarationen (och i definitionen!) av medlemsfunktionen get_x(): ( const ingår i namnet ) class Point int get_x () const ; // funktionsdeklaration ; int Point :: get_x () const // funktionsdefinition return x; Klasser : const för objekt och medlemmar 3. Mer om klasser. Funktionsanrop 13/41 Klasser : const för objekt och medlemmar 3. Mer om klasser. Funktionsanrop 14/41 Konstanta objekt Exempel: överlagring med const Funktionerna get_x() och get_x() const är olika funktioner. Exempel struct Point Point (int xi, int yi) :xxi,yyi int & get_x () return x; int get_x () const return x; int & get_y () return y; int get_y () const return y; int x; int y; ; Om get_x() anropas på ett const-objekt fås en kopia icke-const-object fås en referens Användardefinierade typer Konkreta klasser En konkret typ kan användas på samma sätt som en inbyggd typ dess representation ingår i dess definition, så att objekt kan placeras på stacken (d v s i lokala variabler) i andra objekt i statiskt allokerat minne (i globala variabler ) kopieras tilldelning av variabel värdeanrop av funktion refereras direkt (inte bara genom referenser eller pekare) initieras direkt och fullständigt (med en konstruktor) Klasser : const för objekt och medlemmar 3. Mer om klasser. Funktionsanrop 15/41 Klasser : Kopiering 3. Mer om klasser. Funktionsanrop 16/41 Kopieringskonstruktorer default Kopieringskonstruktor Anropas vid initiering av ett objekt Anropas inte vid tilldelning Kan definieras, men i annat fall definieras automatiskt en standardvariant av kopieringskonstruktor (=default, =delete) void function ( Bar ); // vä rdeanropad parameter Bar b1 (10, false ; Bar b2b1 ; // kopieringskonstruktorn anropas Bar b3(b2 ); // kopieringskonstruktorn anropas Bar b4 = b2; // kopieringskonstruktorn anropas function (b2 ); // kopieringskonstruktorn anropas Deklaration: class C C( const C&) = default ; ; default-kopieringskonstruktor Genereras automatiskt om den inte definieras i koden undantag: om det finns medlemmar som inte kan kopieras Grund kopiering av varje medlem Fungerar för inbyggda typer Fungerar för klasser som uppför sig som inbyggda typer Fungerar inte för klasser som hanterar resurser manuellt (Mer om detta senare) Klasser : Kopiering 3. Mer om klasser. Funktionsanrop 17/41 Klasser : Kopiering 3. Mer om klasser. Funktionsanrop 18/41

Specialfall: noll eller en parameter Kopieringskonstruktor Har en const & som parameter: Bar::Bar(const Bar& b); Typomvandlingskonstruktor En konstruktor med en parameter ger en implicit typkonvertering från parameterns typ class KomplextTal KomplextTal ():re 1, im 0 KomplextTal ( const KomplextTal & k) :rek.re,imk.im KomplextTal ( double x):rex,im 0 double re; double im; ; default constructor copy constructor converting constructor Klasser : Kopiering 3. Mer om klasser. Funktionsanrop 19/41 Typomvandlingskonstruktor Varning - implicit omvandling class Vector Vector ( int s); // create Vector with size s... int size (); // return size of Vector... ; void example_vector () Vector v = 7; std :: cout << "v.size (): " << v.size () << std :: endl ; v. size (): 7 För std::vector är motsvarande konstruktor deklarerad explicit vector ( size_type count ); Klasser : Kopiering 3. Mer om klasser. Funktionsanrop 20/41 Typomvandlingskonstruktor och explicit explicit gör att en konstruktor inte kan anropas implicit för typomvanding. struct A A( int ); ; struct B explicit B( int ); ; Kopiering av objekt Skillnad mellan initiering och tilldelning void function (Bar ); // vä rdeanropad parameter Bar b1 (10, false ; Bar b2b1 ; // kopieringskonstruktorn anropas Bar b3(b2 ); // kopieringskonstruktorn anropas Bar b4 = b2; // kopieringskonstruktorn anropas A a1 (2); A a2 = 1; A a3 = (A )1; // OK // OK // OK B b1 (2); // OK B b2 = 1; // Fel! [2] B b3 = (B )1; // OK: explicit cast function (b2 ); // kopieringskonstruktorn anropas b4 = b3; // kopieringskonstruktorn anropas inte a3 = 17; // OK [1] b3 = 17; // Fel! [3] [1]: skapa en A(17), och dä refter kopiera [2]: conversion from int to non - scalar type B requested [3]: no match for operator= ( operand types are B and int ) Kopierings-tilldelning (copy assignment) inte initiering Klasser : Kopiering 3. Mer om klasser. Funktionsanrop 21/41 Klasser : Kopiering 3. Mer om klasser. Funktionsanrop 22/41 Kopiering av objekt Tilldelningsoperatorn: operator= (copy assignment ) Kopiering Tilldelningsoperatorn för kopiering (copy assignment operator) deklareras implicit med typen T& T::operator=(const T&) om ingen operator= för typen finns deklarerad om alla medlemsvariabler kan kopieras För enkla typer fungerar default-varianterna Mer om kopiering när vi studerar resurshantering Klasser : Kopiering 3. Mer om klasser. Funktionsanrop 23/41 Klasser : Kopiering 3. Mer om klasser. Funktionsanrop 24/41

Initiering och tilldelning Man kan (oftast) skriva som i Java, men det är inte lika effektivt. Som i Java: tilldelning i konstruktor class Foo Foo ( const Bar & v) value = v; OBS! tilldelning, inte initiering Bar value ; initieras innan konstruktorns kropp exekveras ; Objektet är initierat innan konstruktorns funktionskropp anropas Klasser : Kopiering 3. Mer om klasser. Funktionsanrop 25/41 Vänner (friend) Funktioner eller klasser med full tillgång till medlemmar i en klass utan att själv vara medlem Deklaration i klassen Point class Point int x; int y; friend bool operator ==( int, const Point &); ; Definition utanför klassen Point bool operator ==( int x, const Point & p) return p.x == x && p.y == 0; Även medlemsfunktioner från andra klasser eller hela klasser kan vara vänner (jfr. package-synlighet i Java). Klasser : friend 3. Mer om klasser. Funktionsanrop 26/41 Klassdefinitioner Medlemsfunktioner och inline Klassdefinitioner Medlemsfunktioner och inline, exempel Inline-definition av en funktion Koden kan läggas ut direkt på det ställe anropet görs (i stället för att göra ett funktionsanrop) men kompilatorn måste inte göra det Lämpligt endast för mycket enkla funktioner Implicit om funktionsdefinitionen skrivs direkt i klassdefinitionen Om funktionen läggs utanför klassdefinitionen (via ::-notation) används nyckelordet inline framför Inline i klassdefinitionen: class Foo int getvalue () return value ; int value ; ; Inline utanför klassdefinitionen: inline int Foo :: getvalue () return value ; Klasser : inline 3. Mer om klasser. Funktionsanrop 27/41 Klasser : inline 3. Mer om klasser. Funktionsanrop 28/41 : Delas mellan alla objekt i klassen deklareras i klassdefinitionen definieras utanför klassdefinitionen (om inte const) kan vara public eller private (eller protected) class Foo Foo () ++ created ; ++alive ; ~Foo () -- alive ; ; int Foo :: created 0; int Foo :: alive 0; Klasser : 3. Mer om klasser. Funktionsanrop 29/41 Klasser : 3. Mer om klasser. Funktionsanrop 30/41

class Foo Foo () ++ created ; ++alive ; ~ Foo () -- alive ; ; class Foo Foo () ++ created ; ++alive ; ~Foo () -- alive ; ; int Foo :: created 0; int Foo :: alive 0; int Foo :: created 0; int Foo :: alive 0; Klasser : 3. Mer om klasser. Funktionsanrop 30/41 Klasser : 3. Mer om klasser. Funktionsanrop 30/41 class Foo Foo () ++ created ; ++alive ; ~ Foo () -- alive ; ; class Foo Foo () ++ created ; ++alive ; ~Foo () -- alive ; ; int Foo :: created 0; int Foo :: alive 0; int Foo :: created 0; int Foo :: alive 0; Klasser : 3. Mer om klasser. Funktionsanrop 30/41 Klasser : 3. Mer om klasser. Funktionsanrop 30/41 Fundera över Objekt som returvärden Fundera över Objekt som returvärden Vad skrivs ut av programmet nedan? Vi kan inte returnera referenser till lokala variabler (objekt som allokerats på stacken) i en funktion. objektet förstörs vid return dangling reference Hur (in)effektivt är det att istället returnera kopior av objekt? class C C() : a0, b0 cout << "A C was made.\n"; C( const C& o) :ao.a,bo.b cout << "A copy was made.\n"; void print () cout << "C(" << a << "," << b << ")\n"; int a; int b; ; C f() return C(); ; int main () cout << " Testing copying \n"; C obj = f(); obj.print (); Funktionsanrop : Referens- eller värdeanrop, tumregler 3. Mer om klasser. Funktionsanrop 31/41 Funktionsanrop : Referens- eller värdeanrop, tumregler 3. Mer om klasser. Funktionsanrop 32/41

Fundera över Objekt som returvärden Svar return value optimization (RVO) Som programmet är skrivet anropas default-konstruktorn en gång och copy-konstruktorn två gånger 1 vid initialiseringen av den anonyma returvariabeln i f() och 2 vid initialiseringen av variabeln obj. Vad som faktiskt skrivs ut beror på hur bra kompilatorn är på att optimera! Både Visual Studio och g++ optimerar bort båda anropen av copy-konstruktorn och ger följande utskrift: Testing copying A C was made. C(0,0) Andra kompilatorer kan ge andra svar Kompilatorn får lov att optimera bort kopiering av objekt vid return från funktioner return by value ofta effektivt, även för större objekt RVO tillåtet även om copy-konstruktorn eller destruktorn har sidoeffekter undvik sådana sidoeffekter för att göra koden portabel Funktionsanrop : Referens- eller värdeanrop, tumregler 3. Mer om klasser. Funktionsanrop 33/41 Funktionsanrop : Referens- eller värdeanrop, tumregler 3. Mer om klasser. Funktionsanrop 34/41 Tumregler för funktionsparametrar Referens- eller värdeanrop Tumregler Returnera värde oftare Överanvänd inte värdeanrop reasonable defaults cheap to copy moderately cheap to copy expensive to copy In f(x) f(const X&) In/Out f(x&) Out X f() f(x&) För resultat (returvärde), om kostnaden för kopiering är liten, eller måttlig (< 1 k, sammanhängande): returnera värde (moderna kompilatorer gör RVO: return value optimization) Om du skickar ett objekt som parameter till en funktion och du vill kunna ändra värdet på objektet referens: void f(t&); eller pekare: void f(t*); du vill inte ändra objektet, men det är stort konstant referens: void f(const T&); annars, använd värdeanrop void f(t); stor : använd referensanrop som utparameter eller kanske allokera med new och returnera pekare Funktionsanrop : Referens- eller värdeanrop, tumregler 3. Mer om klasser. Funktionsanrop 35/41 Funktionsanrop : Referens- eller värdeanrop, tumregler 3. Mer om klasser. Funktionsanrop 36/41 Referens- eller värdeanrop Tumregler referens eller pekare? Hur stort är stort? mer än ett par ord När använda utparametrar? skriv program som är lätta att förstå Exempel: två funktioner: void incr1 (int & x) ++x; int incr2 (int x) return x + 1; Här är det tydligare att v = incr2(v) ändrar v Användning: int v = 0;... incr1 (v);... v = incr2 (v); nödvändig/obligatorisk parameter: skicka referens valfri parameter: skicka pekare (kan vara nullptr) void f( widget & w) use(w); // required parameter void g( widget * w) if(w) use(w); // optional parameter Funktionsanrop : Referens- eller värdeanrop, tumregler 3. Mer om klasser. Funktionsanrop 37/41 Funktionsanrop : Referens- eller värdeanrop, tumregler 3. Mer om klasser. Funktionsanrop 38/41

Läsanvisningar Nästa föreläsning Klasser 2.6, 7.1.4, 7.1.5 7.5 7.5.4 (Aggregate classes) ("C-structs"utan konstruktorer) 7.5.5 Destruktorer 13.1.3 const, constexpr 2.4 this och const s 257 258 inline 6.5.2, s 273 friend 7.2.1 static members 7.6 Kopiering 13.1.1 Tilldelning 13.1.2 Operatoröverlagring 14.1 Referenser till relaterade avsnitt i Lippman Pekare och Referenser 2.3 Arrayer och pekare 3.5 Flerdimensionella arrayer 3.6 Sekvenser 3.3, 9.1, 9.2, 9.3.1 9.3.3 Iteratorer 3.4, 9.2.1 Associativa containers 11.1 11.3.2 Funktionsanrop : Referens- eller värdeanrop, tumregler 3. Mer om klasser. Funktionsanrop 40/41 Funktionsanrop : Referens- eller värdeanrop, tumregler 3. Mer om klasser. Funktionsanrop 41/41