1999-11-16Upplysning C++ / Sven "-E" Rosvall1 C++ för den som tror sej kunna C++ Sven Rosvall

Slides:



Advertisements
Liknande presentationer
Avlusning Debugger (”avlusare”) Breakpoints Watch.
Advertisements

Array Skriv ett program som frågar följande: ”Hur många tal vill du mata in?” användaren matat in ett tal t.ex n. då frågar programmet n ggr följande.
Klasser och objekt.
Fortsättningskurs i Programmering lektion 3 Johan Hjerling
Klassarv och inkapsling
OOP Objekt-orienterad programmering
Metoder i java Det finns två typer av metoder i java
Föreläsning 4 Python: mera om funktioner och parametrar
Polymorfism.
Övning5 Så här ska man tänka när man löser uppgift 1 på tentan lite grafik, så här söker man genom en lista så här läser man från en fil i java lösa uppgift.
Att programmera i språket Java
Föreläsning 8 Appletprogram/fristående grafiska program Rita linjer, rektanglar mm Skriva text Byta färg Appletprogram html.
1 Föreläsning 6 Klass Object, instans av klass public/private Klassvariabler och klassmetoder.
Exception Handling Kapitel 9. Agenda Exceptions try, throw and catch Skapa en egen exception-klass Multipla throw / catch Slänga vidare en exception Olika.
Streams and File I/O Kapitel 10. Agenda Exceptions Textfiler Skriva Appenda Läsa File Sökvägar.
i olika programmeringsspråk
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Objektbaserad programmering –Grundläggande om klasser och objekt – (Arv får vänta)  Iden med klasser.
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Konstruktor Ser till att objektets data är korrekt initierade MinKlass::MinKlass(); MinKlass::MinKlass(int.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser och instansvariabler -Tabeller av klassobjekt.
Föreläsning 11 Arrayer.
OOP F4:1 Marie Olsson OOP Objekt-orienterad programmering Föreläsning 4 Metoder klass-metoder instans-metoder.
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT C++ - förbättrat C?  Procedurellt program ser ut som C: sekvens, selektion, iteration  /* kommentar.
Sid 1 CD5250 OOP med C++ Daniel Flemström MDH/IDT CD5250 OOP med C++
Variabler: Datatyp - grundläggande : int, double, char, boolean eller
Programmering i C# 3. Klasser.
Repetition inför slutprovet
Föreläsning 5. Problemet Vi har sett att vi kan ersätta de metoder vi ärver från överklassen med egen funktionalitet (polymorfism) class Bil : public.
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 4 ( )‏ Innehåll:Trådsäkerhet - Intrinsic locks och synkronisering - Synchronized statements.
int res2=Math.max(tal1,tal2);
Föreläsning 2 Kort Översikt Över Javaspråket. Källkodsformat Unicode används åäöμψζ tillåtna Inte alla miljöer klarar av det Källkod Bytekod Java VM för.
Polymorfism.
Mer om arv - Polymorfism Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling Fredric Ragnar
Mitt första Java program Mahmud Al Hakim Copyright, Mahmud Al Hakim, 1.
OOP F3:1 Marie Olsson OOP Objekt-orienterad programmering Föreläsning 3 Iteration Många variabler av samma sort – Arrayer.
Föreläsning 8 Arv och abstrakta klasser. Arv Definierar en klass utifrån en redan existerande klass Den nya klassen utökar den ärvda klassen ( extends.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 8 ( ) INNEHÅLL:Klasser: -Konstruktorer -Klassvariabler -Instansmetoder -Privata.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Metoder -Lokala variabler -Mera om klasser: -Nyckelorden.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
Föreläsning 10 Stränghantering.
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Föreläsning 9 Gränssnitt. Super Super kan användas till anrop av en omdefinierad metod Super kan användas till anrop av konstruktorer i superklassen Super.
TILLÄMPAD DATALOGI (TILDA) Övning 3
För utveckling av verksamhet, produkter och livskvalitet. Stack och Kö - Implementering - Tilllämpningar.
1 ITK:P2 F6 Sortering av generiska containerklasser DSV Peter Mozelius.
Stack och Kö -Implementering -Tilllämpningar -- Kapitel 16, 11.
1. Ett problem/uppgift.
PROGRAMMERINGSTEKNIK Övningsgrupp 3 Marcus Hjelm
Föreläsning 4 programmeringsteknik och Matlab 2D1312/ 2D1305
Föreläsning 1 Om kursen Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
ITK:P1 Föreläsning 2 Introduktion till objektorientering DSV Marie Olsson.
PROCESSPROGRAMMERING Föreläsning 1 ( )‏ Innehåll: Introduktion till paralellprogrammering (“concurrent programming”)‏ Introduktion till parallellprogrammering.
Föreläsning 2. Allmänt STL genererar varningar i Visual C++ –”#pragma warning (disable : 4786)”
Föreläsning 3, Kapitel 3 Objektinteraktion - Skapa objekt som samarbetar Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David.
Köer -- Kapitel 16. Principen med en kö Köer är FIFO datastrukturer  First In – First Out  enqueue() Lägg till data i kön (först)  dequeue() Hämta.
Objekt, Klass och Instans Analys av systemet ger mer eller mindre detaljerade objekt Objekten sorteras och klass-diagram ritas upp där relationer reds.
TILLÄMPAD DATALOGI (TILDA) Övningsgrupp 2 Marcus Hjelm
TILLÄMPAD DATALOGI (TILDA) Övning 1 Marcus Hjelm
OOP F5:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 5 Klasser och objekt Skapa objekt - new Referenser Konstruktorer Inkapsling.
Övning2 programmeringsteknik och Matlab 2D1312/ 2D1305
Övning 3. Repetition Metoder class RepetitionMetoder { public static void main(String [] args) double längd = 2.0; double bredd = 1.0; double area =
TILLÄMPAD DATALOGI (TILDA) Övning 2
TILLÄMPAD DATALOGI (TILDA) Övning 2
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Funktionsmall template void myfunc(Type * arr, int n) { // kod; // objekt av typ Type kan deklareras.
1 Föreläsning 2 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Malmö högskola Rolf Axelsson 2003/2004 DA7231, 4 poäng Referensvariabel Klass och konstruktorer Klass med set- och get-metoder Klass och fält Fler metoder.
Malmö högskola Rolf Axelsson 2004/2005 DA7350, 10 poäng char Klassen String Klass och attribut Klass och metoder Föreläsning 30/
TDP004 Objektorienterad Programmering Fö 6 Objektorientering forts.
Länkade listor á la C/C++
Detaljer i exception-hantering
Föreläsning 3: Booleans, if, switch
Presentationens avskrift:

Upplysning C++ / Sven "-E" Rosvall1 C++ för den som tror sej kunna C++ Sven Rosvall

Upplysning C++ / Sven "-E" Rosvall2 Programming Research Ltd Hjälper utvecklare med bättre kvalitet billigare. Utvecklingsprocesser. Fokus på kodinspektion. Verktyg för statisk analys av kod.

Upplysning C++ / Sven "-E" Rosvall3 Innehåll ikväll Standard C++ Vanliga och ovanliga fel Styrkor Effektivitet Praktisk användning av C++

Upplysning C++ / Sven "-E" Rosvall4 Standard C++ Standarden antagen Juni 1998 ISO/IEC Arbetet idag

Upplysning C++ / Sven "-E" Rosvall5 Vanliga och ovanliga fel Resurser Polymorfism Exceptions Konverteringar

Upplysning C++ / Sven "-E" Rosvall6 Resurser Dynamiskt minne, fil-handtag,... Ofta problem med vem som ansvarar för skapande och borttagande. Mycket tid går åt att spåra resurser som hanteras fel.

Upplysning C++ / Sven "-E" Rosvall7 Exempel: class String class String { public: String(const char * = 0); private: char * rep; }; String::String(const char *value) { rep = new char[strlen(value)+1] ; strcpy(rep, value) ; }

Upplysning C++ / Sven "-E" Rosvall8 Exempel: class String class String { public: String(const char * = 0); ~String(); private: char * rep; }; String::~String() { delete [] rep; }

Upplysning C++ / Sven "-E" Rosvall9 Exempel: class String class String { public: String(const char * = 0); ~String(); operator const char *() const; private: char * rep; }; String::operator const char *() const { return rep; }

Upplysning C++ / Sven "-E" Rosvall10 Exempel: class String void doNothing(String a) { } void work1() { String s(“hej”); doNothing(s); std::cout << s << std::endl; // ??? } String doHello() { return “hej”; } void work2() { String s; s = doHello(); std::cout << s << std::endl; // ??? }

Upplysning C++ / Sven "-E" Rosvall11 Exempel: class String class String { public:... String(const String &); const String & operator=(const String &); private: char * rep; }; String::String(const String &value) { rep = new char[strlen(value.rep)+1] ; strcpy(rep, value.rep) ; }

Upplysning C++ / Sven "-E" Rosvall12 Exempel: class String class String { public:... String(const String &); const String & operator=(const String &); private: char * rep; }; const String & String::operator=(const String &value) { delete [] rep; rep = new char[strlen(value.rep)+1] ; strcpy(rep, value.rep) ; return *this; }

Upplysning C++ / Sven "-E" Rosvall13 Exempel: class String void work() { String a(“hej”); a = a; // Bang! }

Upplysning C++ / Sven "-E" Rosvall14 Exempel: class String const String & String::operator=(const String &value) { if (&value != this) { delete [] rep; rep = new char[strlen(value.rep)] ; strcpy(rep, value.rep) ; } return *this; }

Upplysning C++ / Sven "-E" Rosvall15 Binära operatorer String a(“hej”); String b(“ världen”); String c; c = a + b ;

Upplysning C++ / Sven "-E" Rosvall16 Binära operatorer class String { public:... const String & operator+=(const String&); String operator+(const String&);... }; String String::operator+(const String &right) { String temp(*this); temp += right; return temp; }

Upplysning C++ / Sven "-E" Rosvall17 Binära operatorer class String { public:... const String & operator+=(const String&); String operator+(const String&);... }; const String & String::operator+=(const String &right) { char* temp = new char[strlen(rep)+strlen(right.rep)+1]; strcpy(temp, rep); strcat(temp, right); delete rep; rep = temp; return *this; }

Upplysning C++ / Sven "-E" Rosvall18 Binära operatorer String a(“hej”); String b(“ världen”); String c; c = a + b; // funkar fint! c = a + “ alla”; // funkar fint! c = “hela” + b; // funkar inte!

Upplysning C++ / Sven "-E" Rosvall19 Binära operatorer class String { public:... const String & operator+=(const String&);... }; String operator+(const string &, const String&); String operator+(const String &left, const String &right) { String temp(left); temp += right; return temp; }

Upplysning C++ / Sven "-E" Rosvall20 Använd std::string istället för char* Slipper tänka på dynamiskt minne Slipper tänka på tillräckligt utrymme

Upplysning C++ / Sven "-E" Rosvall21 Dynamiskt minne Hur länge finns objektet? Vem tar bort objektet? Vem mer kan tänkas vara intresserad av objektet?

Upplysning C++ / Sven "-E" Rosvall22 std::auto_ptr Ansvarar för ett dynamiskt objekt När auto_ptr går försvinner städar den bort sitt objekt. #include void f() { std::auto_ptr p = new char ; *p = ‘x’ ; std::cout << “x=“ << *p << std::endl; } // p is deleted.

Upplysning C++ / Sven "-E" Rosvall23 Referensräknande pekare Flera pekare till ett objekt Ingår tyvärr inte i C++-biblioteket Ett antal varianter: Ptr T [count] T Ref [count] Ref [count] T

Upplysning C++ / Sven "-E" Rosvall24 Begränsningar Cirkulära listor. Måste fortfarande tänka på ägarskap. Ibland lever en rå pekare eller referens kvar.

Upplysning C++ / Sven "-E" Rosvall25 Polymorfism Ett antal olika typer behandlas lika. Gemensamt interface. Kräver access via pekare eller referens Kräver omtanke i design

Upplysning C++ / Sven "-E" Rosvall26 Polymorfism class B { public: B() ; virtual void dosomething() const; }; class D : public B { public: D(string) ; virtual void dosomething() const; private: string s; };

Upplysning C++ / Sven "-E" Rosvall27 Polymorfism via handtag void f(B b) { b.dosomething(); } void g(const B &b) { b.dosomething(); } D d(“hello”); f(d); // pass by value => Slicing! g(d); // pass by reference => OK.

Upplysning C++ / Sven "-E" Rosvall28 Polymorfism via handtag B *bp = new D(2); // create D object delete bp; // destroy object

Upplysning C++ / Sven "-E" Rosvall29 Polymorfism via handtag B *bp1 = new D; B *bp2 = new D; *bp2 = *bp1 ; // copy D objects?

Upplysning C++ / Sven "-E" Rosvall30 Polymorfism class B { public: B() ; virtual ~B() ; virtual void dosomething() const; protected: const B & operator=(const B &); }; class D : public B { public: D(string) ; virtual ~D() ; virtual void dosomething() const; const D & operator=(const D &); private: string s; };

Upplysning C++ / Sven "-E" Rosvall31 Exceptions Används för felhantering Kan dock ställa till med problem

Upplysning C++ / Sven "-E" Rosvall32 Exempel: exceptions void f() { char *p = new char; *p = ‘x’; std::cout << “x=“ << *p << std::endl; delete p; }

Upplysning C++ / Sven "-E" Rosvall33 Exempel: exceptions void f() { char *p = new char; *p = ‘x’; try { std::cout << “x=“ << *p << std::endl;’ } catch (...) { delete p; throw; } delete p; }

Upplysning C++ / Sven "-E" Rosvall34 Exempel: exceptions #include void f() { std::auto_ptr p = new char; *p = ‘x’; std::cout << “x=“ << *p << std::endl; } // p is deleted.

Upplysning C++ / Sven "-E" Rosvall35 Tankenöt Without being given any additional information, how many execution paths could there be in the following code? String EvaluateSalaryAndReturnName( Employee e ) { if( e.Title() == "CEO" || e.Salary() > ) { cout << e.First() << " " << e.Last() << " is overpaid" << endl; } return e.First() + " " + e.Last(); }

Upplysning C++ / Sven "-E" Rosvall36 Design av exceptions Klasshierarki Låt gärna exception-objekt innehålla information Exception-objekt skall aldrig kasta exceptions

Upplysning C++ / Sven "-E" Rosvall37 Hantering av exceptions Fånga exceptions via referens Ange sub-exceptions före bas-exceptions

Upplysning C++ / Sven "-E" Rosvall38 Konverteringar Kopiering via basklass Oönskade konverteringar Flertydliga konverteringar

Upplysning C++ / Sven "-E" Rosvall39 Oönskade konverteringar void work1() { String s(“4”); if (s != “4”) { std::cout << “Inte fyra” << std::endl; }

Upplysning C++ / Sven "-E" Rosvall40 Exempel: class String void work1() { String s(“4”); if (s != String(“4”)) { std::cout << “Inte fyra” << std::endl; }

Upplysning C++ / Sven "-E" Rosvall41 Oönskade konverteringar class A { public: A(const class B&); }; class B { public: operator A() const; }; void work() { void f(A) ; B b; f(b); }

Upplysning C++ / Sven "-E" Rosvall42 Styrkor Objektorientering Stark typning Biblioteket

Upplysning C++ / Sven "-E" Rosvall43 Stark typning Funktionssignaturer måste alltid ges. Även länkaren kontrollerar typer. Templates hjälper till.

Upplysning C++ / Sven "-E" Rosvall44 Exempel: max(T, T) template T max(T a, T b) { return (a<b)?b:a; } a = max(”foo”, 1.0); // Felaktiga typer.

Upplysning C++ / Sven "-E" Rosvall45 Exempel: Matriser Matris-operationer kan bara utföras på matriser med kompatibla storlekar Kolla storlekarna tidigt.

Upplysning C++ / Sven "-E" Rosvall46 Exempel: Matriser (1) template class matrix {... }; template matrix operator+(const matrix &, const matrix &); template matrix operator*(const matrix &, const matrix &);

Upplysning C++ / Sven "-E" Rosvall47 Exempel: Matriser (2) matrix m1, m2, r1; matrix v; matrix r2; r1 = m1 + m2; r2 = m1 * v;

Upplysning C++ / Sven "-E" Rosvall48 Biblioteket Containers Algoritmer Streams och strängar

Upplysning C++ / Sven "-E" Rosvall49 Containers Sekvenser –list / vector / deque –queue / stack / priority_queue Associativa tabeller –set / map / multiset / multimap

Upplysning C++ / Sven "-E" Rosvall50 Iteratorer Iteratorer istället för pekare Varje container har sin egen iterator Iteratorer för olika container har samma grundfunktion Vissa container har iteratorer med mer funktionalitet

Upplysning C++ / Sven "-E" Rosvall51 Typer av iteratorer Input iterator Output iterator Forward iterator Bidirectional iterator Random access iterator

Upplysning C++ / Sven "-E" Rosvall52 Exempel: Iterator #include int count_values(vector & container, int value) { int count = 0; for (vector ::const_iterator iter = container.begin(); iter != container.end(); ++iter) { if (*iter == value) { ++count; } return count; }

Upplysning C++ / Sven "-E" Rosvall53 Algoritmer for_each find find_if find_end find_first_of adjacent_find count count_if mismatch equal search search_n copy copy_backward swap_ranges iter_swap transform replace replace_if replace_copy replace_copy_if fill fill_n generate generate_n remove remove_if remove_copy remove_copy_if unique unique_copy reverse reverse_copy rotate rotate_copy random_shuffle partition stable_partition sort stable_sort partial_sort partial_sort_copy nth_element lower_bound upper_bound equal_range binary_search merge inplace_merge includes set_union set_intersection set_difference set_symmetric_difference push_heap pop_heap make_heap sort_heap min max min_element max_element lexicographical_compare next_permutation prev_permutation

Upplysning C++ / Sven "-E" Rosvall54 Exempel: Algoritm #include void work() { std::vector vi; doSomething(vi); int count = std::count(vi.begin(), vi.end(), 4); }

Upplysning C++ / Sven "-E" Rosvall55 Exempel: Algoritm #include bool isPalindrome(const std::string &s); void work() { std::vector vs; doSomething(vs); int count = std::count_if(vs.begin(), vs.end(), isPalindrome); }

Upplysning C++ / Sven "-E" Rosvall56 Exempel: Algoritm class contains { public: contains(const std::string &s) : m_s(s) {} operator()(const std::string &s); private: std::string m_s; }; void work() { std::vector vs; doSomething(vs); int count = std::count_if(vs.begin(), vs.end(), contains(“foo”); }

Upplysning C++ / Sven "-E" Rosvall57 Exempel: Fakultet class incr_generator { int count; public: explicit incr_generator(int init_value) : count(init_value) {} int operator()() { return count++; } }; int fak(int n) { std::vector v(n); std::generate(v.begin(), v.end(), incr_generator(1)); return std::accumulate(v.begin(), v.end(), 1, std::multiplies ()); }

Upplysning C++ / Sven "-E" Rosvall58 Exempel: Fakultet (2) int fak(int n) { std::vector v(n); v[0] = 1; std::transform(v.begin(), v.end()-1, v.begin()+1, std::bind2nd(std::plus (), 1)) ; return std::accumulate(v.begin(), v.end(), 1, std::multiplies ()); }

Upplysning C++ / Sven "-E" Rosvall59 Egna algoritmer #include template void do_something(Iterator first, Iterator last) { std::cout << "Generic do_something" << std::endl ; } int main() { std::list li ; do_something(li.begin(), li.end()) ; std::vector vi ; do_something(vi.begin(), vi.end()) ; }

Upplysning C++ / Sven "-E" Rosvall60 Egna algoritmer #include template void do_something(Iterator first, Iterator last) { do_something(first, last, std::iterator_traits ::iterator_category()) ; } template void do_something(Iterator first, Iterator last, IteratorTag tag) { std::cout << "Generic do_something" << std::endl ; } template void do_something(Iterator first, Iterator last, std::random_access_iterator_tag tag) { std::cout << "Random access do_something" << std::endl ; }

Upplysning C++ / Sven "-E" Rosvall61 Iterator-adaptorer reverse_iterator insert_iterator –insert_iterator –back_insert_iterator –front_insert_iterator stream iterators –istream_iterator –ostream_iterator –istreambuf_iterator –ostreambuf_iterator

Upplysning C++ / Sven "-E" Rosvall62 Effektivare programmering Eliminering av temporära objekt Inlining Snabbare kompileringar

Upplysning C++ / Sven "-E" Rosvall63 Temporära objekt String operator+(String left, // copy parameter String right) // copy parameter { String temp = left ; // create temporary ; copy parameter temp += right ; return temp ; // copy to return value } String a, b, c; c = a + b ; // 4 temporaries!

Upplysning C++ / Sven "-E" Rosvall64 Temporära objekt (2) String a ; String c = a + ”hello” ; // c = a + String(”hello”) Lösning: String operator+(const String &, const char *); String operator+(const char *, const String &);

Upplysning C++ / Sven "-E" Rosvall65 Inlining Endast råd till kompilatorn Det måste finnas riktiga funktioner för virtuella funktioner eller funktioner som någon tar adressen till. Länkaren måste ta hand om inline-ade funktioner som inte inline-as. Vissa små funktioner kan bli stora.

Upplysning C++ / Sven "-E" Rosvall66 Snabbare kompileringar Forward-deklarationer istället för #include Pimpl-klasser Klass med interface använder en pekare till en klass med implementationen. Protokoll-klasser En basklass implementerar interface. Implementationen finns i en ärvd klass.

Upplysning C++ / Sven "-E" Rosvall67 Felmeddelanden std::list > ptrlist ; Visual C++ (6.0) säger: error.cpp(8) : syntax error : missing ',' before identifier 'ptrlist' error.cpp(8) : 'ptrlist' : undeclared identifier error.cpp(8) : syntax error : missing '>' before ';’ GNU C säger: error.cpp:8: warning: `>>' should be `> >' in template class name

Upplysning C++ / Sven "-E" Rosvall68 Felmeddelanden void foo(int) ; std::list ls ; foo(ls) ; Visual C++ (6.0) säger: error.cpp(3) : 'foo' : cannot convert parameter 1 from 'class std::list,class std::allocator >,class std::allocator,class std::allocator > > >' to 'int’ GNU C säger: error.cpp:3:`class list, __default_alloc_template >,__default_al loc_template >' used where a `int' was expected

Upplysning C++ / Sven "-E" Rosvall69 Fakultet som konstant template struct fak { enum { C = n * fak ::C }; }; template <> struct fak { enum { C = 1 }; }; const int F5 = fak ::C;

Upplysning C++ / Sven "-E" Rosvall70 Referenser ISO/IEC Programming Languages - C++ Effective C++ av Scott Meyers The C++ Standard Library av Nicolai M. Josuttis Guru of the Week Programming Research Denna föreläsning