C++ język nie dla ludzi o słabych nerwach. Małgorzata Bieńkowska

Podobne dokumenty
Wprowadzenie do szablonów klas

Identyfikacje typu na etapie. wykonania (RTTI)

Szablony funkcji i szablony klas

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Składnia C++ Programowanie Obiektowe, część 3 Mateusz Cicheński

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Materiały. Języki programowania II (Java+AVR-GCC) Literatura

Programowanie obiektowe w języku

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Informatyka. Wy-03 Dynamiczna alokacja pamięci, wyjątki. mgr inż. Krzysztof Kołodziejczyk

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Programowanie 2. Język C++. Wykład 3.

Szablony. Szablony funkcji

Programowanie w języku C++

Sieciowa komunikacja procesów - XDR i RPC

Curiously recurring template pattern

Inżynieria Wytwarzania Systemów Wbudowanych

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Wprowadzenie do szablonów szablony funkcji

Refleksja oraz metaklasy w C++ W dążeniu do prostszego oraz efektywniejszego kodu w C++

Imię i nazwisko: PYTANIA I ODPOWIEDZI Nr 0 EGZAMIN Język C++ 27 czerwca 2011

Programowanie obiektowe w C++ Wykład 12

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Stos liczb całkowitych

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

Plik klasy. h deklaracje klas

Dzisiejszy wykład. Wzorce funkcji Wzorce klas Tablica asocjacyjna Składowe statyczne

Kurs programowania. Wykład 9. Wojciech Macyna

Wprowadzenie do szablonów szablony funkcji

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Wprowadzenie do programowanie obiektowego w języku C++

obiekty funkcyjne - funktory

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Obsługa wyjątków. Język C++ WW12

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Język ludzki kod maszynowy

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Informatyka. Wy-08 Klasy. mgr inż. Krzysztof Kołodziejczyk

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Projektowanie klas c.d. Projektowanie klas przykład

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Wartości domyślne, szablony funkcji i klas

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Programowanie gier eventy. Dalton & Cartman KNTG Polygon, 21 grudnia 2015 r.

Programowanie komputerowe. Zajęcia 4

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

DYNAMICZNE PRZYDZIELANIE PAMIECI

C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue

Programowanie obiektowe

C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Konstruktor kopiujacy

Wstęp do Programowania 2

PROGRAMOWANIE w C prolog

Programowanie Obiektowew języku C++ Zadania L4

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Programowanie, część I

Zaawansowane programowanie w C++ (PCP)

Wstęp do Programowania 2

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Dziedziczenie. Ogólna postać dziedziczenia klas:

Programowanie Komputerów

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Paradygmaty programowania. Paradygmaty programowania

Języki programowania - podstawy

Podstawy programowania III WYKŁAD 6

Abstrakcyjny typ danych

Programowanie w języku C++

Szablony klas, zastosowanie szablonów w programach

Szablony funkcji i klas (templates)

Zdalne wywołania procedur. Jarosław Kuchta Programowanie Współbieżne

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Signals + Threads: Qt vs. Boost

Programowanie obiektowe w języku

Programowanie, część I

Zaawansowane programowanie w C++ (PCP)

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Język C++ wykład VIII

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Optymalizacje c++11. Piotr Padlewski. Warsaw C++ Users Group


Programowanie Obiektowe i C++

ROZDZIAŁ 2. Operatory

ATD. Wykład 8. Programowanie (język C++) abstrakcyjny typ danych. Abstrakcyjne typy danych (ATD) Metody czysto wirtualne. Definicje i uwagi:

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

it = 0; memset((void *)ptr, 0, items*sizeof(double)); cout << "Konstruktor sparametryzowany " << title << " adres: " << ptr << "\n";

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

Transkrypt:

C++ język nie dla ludzi o słabych nerwach Małgorzata Bieńkowska malgorzata.bienkowska@gmail.com

9LivesData HYDRAStor Dla NEC Japan od ponad 10 lat 1,5 miliona linii kodu większość rozwijana w Warszawie www.9livesdata.com

typedef int MyIntType;

//typedef int MyIntType; class MyIntType public: MyIntType(); MyIntType(int);

//typedef int MyIntType; class MyIntType public: MyIntType(); MyIntType(int); void foo() int max = numeric_limits<myinttype>::max();...

<limits> template<class T> class numeric_limits public: static constexpr T max() noexcept return T();... template<> struct numeric_limits<int> static constexpr int max() noexcept return INT_MAX ;

class MyPointer public: MyPointer(int *); int * get() const; private: int * ptr; MyPointer ptr(null); if (ptr) cout << "MyPointer is true" << endl; else cout << "MyPointer is false" << endl; $ clang++ sample2.cpp -o sample-clang.out -std=c++11 -Weverything sample2.cpp:40:9: error: value of type 'MyPointer' is not contextually convertible to 'bool' if (ptr) ^~~ 1 error generated.

class MyPointer public: MyPointer(int *); int * get() const; operator bool() const return ptr!= NULL; private: int * ptr; MyPointer ptr(null); if (ptr) cout << "MyPointer is true" << endl; else cout << "MyPointer is false" << endl; $ clang++ sample2.cpp -o sample-clang.out -std=c++11 -Weverything $./sample-clang.out MyPointer is false

class MyPointer public: MyPointer(int *); int * get() const; operator bool() const return ptr!= NULL; private: int * ptr; struct AnotherClass operator bool() const return false; MyPointer ptr(null); AnotherClass a; if (a==ptr) cout << "Uncomparable classes are compared" << endl; $ clang++ sample2.cpp -o sample-clang.out -std=c++11 -Weverything $./sample-clang.out Uncomparable classes are compared

class MyPointer public: MyPointer(int *); int * get() const; typedef int* (MyPointer::*UnspecifiedBoolType)() const; operator UnspecifiedBoolType() const return NULL == this->get()? NULL : &MyPointer::get; struct AnotherClass operator bool() const return false; MyPointer ptr(null); AnotherClass a; if (ptr) cout << "MyPointer is true" << endl; if (a==ptr) cout << "Uncomparable" << endl; private: int * ptr; $ clang++ sample2.cpp -o sample-clang.out -std=c++11 -Weverything sample2.cpp:52:6: error: invalid operands to binary expression ('AnotherClass' and 'MyPointer') if (a==ptr) ~^ ~~~ 1 error generated.

class MyPointer public: MyPointer(int *); int * get() const; typedef int* (MyPointer::*UnspecifiedBoolType)() const; operator UnspecifiedBoolType() const return NULL == this->get()? NULL : &MyPointer::get; MyPointer ptrnull(null); MyPointer ptr1(new int(1)); MyPointer ptr2(new int(2)); if (ptrnull==ptr1) cout << "ptrnull==ptr1" << endl; if (ptr1==ptr2) cout << "ptr1==ptr2" << endl; private: int * ptr; domek@domek ~/Pulpit/cpp-meetup $ clang++ sample2.cpp -o sample-clang.out -std=c++11 -Weverything domek@domek ~/Pulpit/cpp-meetup $./sample-clang.out ptr1==ptr2

Safe bool solution in C++11 explicit operator bool();

class MyPointer public: MyPointer(int *); int * get() const; explicit operator bool() const return ptr!= NULL; private: int * ptr; MyPointer ptrnull(null); MyPointer ptr1(new int(1)); MyPointer ptr2(new int(2)); if (ptrnull==ptr1) cout << "ptrnull==ptr1" << endl; if (ptr1==ptr2) cout << "ptr1==ptr2" << endl; $ clang++ sample2.cpp -o sample-clang.out -std=c++11 sample2.cpp:49:12: error: invalid operands to binary expression ('MyPointer' and 'MyPointer') if (ptrnull==ptr1) ~~~~~~~^ ~~~~ sample2.cpp:52:9: error: invalid operands to binary expression ('MyPointer' and 'MyPointer') if (ptr1==ptr2) ~~~~^ ~~~~ 1 warning and 2 errors generated.

Wirtualne destruktory class A virtual void foo() = 0; private: Foo a; class AA : public A public: virtual void foo() Foo aa; A* a = new AA(); delete a;

Wirtualne destruktory class A virtual void foo() = 0; private: Foo a; class AA : public A public: virtual void foo() Foo aa; $ clang++ sample.cpp -o sample-clang.out sample.cpp:41:1: warning: delete called on 'A' that is abstract but has non-virtual destructor [-Wdelete-non-virtual-dtor] delete a; ^ 1 warning generated. $ g++ sample.cpp -o sample-gcc.out $ A* a = new AA(); delete a;

Wirtualne destruktory class A virtual void foo() = 0; private: Foo a; class AA : public A public: virtual void foo() Foo aa; A* a = new AA(); delete a; $ clang++ sample.cpp -o sample-clang.out sample.cpp:41:1: warning: delete called on 'A' that is abstract but has non-virtual destructor [-Wdelete-non-virtual-dtor] delete a; ^ 1 warning generated. $ g++ sample.cpp -o sample-gcc.out $ g++ sample.cpp -o sample-gcc.out -Wall sample.cpp: In function int main() : sample.cpp:106:8: warning: deleting object of abstract class type main()::a which has non-virtual destructor will cause undefined behaviour [-Wdelete-non-virtual-dtor] delete a;

Wirtualne destruktory class A virtual void foo() private: Foo a; class AA : public A public: virtual void foo() Foo aa; $ clang++ sample.cpp -o sample-clang.out $ g++ sample.cpp -o sample-gcc.out $ A* a = new AA(); delete a;

Wirtualne destruktory class A // virtual void foo() = 0; private: Foo a; $ clang++ sample.cpp -o sample-clang.out -Wall $ g++ sample.cpp -o sample-gcc.out -Wall -Wextra $./sample-gcc.out *** Error in `./sample-gcc.out': free(): invalid pointer: 0x000000000068fc28 *** class AA : public A public: virtual void foo() Foo aa; A* a = new AA(); delete a;

Wirtualne destruktory class A // virtual void foo() = 0; private: Foo a; $ clang++ sample2.cpp -o sample-clang.out -std=c++11 -Weverything sample2.cpp:23:7: warning: 'AA' has virtual functions but non-virtual destructor [-Wnon-virtual-dtor] class AA : public A class AA : public A public: virtual void foo() Foo aa; A* a = new AA(); delete a;

Wirtualne destruktory class A // virtual void foo() = 0; private: Foo a; class AA : public A public: virtual void foo() Foo aa; A* a = new AA(); delete a; $ clang++ sample.cpp -o sample-clang.out -Wall $ g++ sample.cpp -o sample-gcc.out -Wall -Wextra $./sample-gcc.out *** Error in `./sample-gcc.out': free(): invalid pointer: 0x000000000068fc28 *** unique_ptr<a>? shared_ptr<a>?

Clang and gcc warnings domek@domek ~/Pulpit/cpp-meetup $ g++ --help=warnings grep "-" wc -l 218 domek@domek ~/Pulpit/cpp-meetup $ cat clang-warnings wc -l 672

Clang obroną nam

T const & t = geta().getb();

T const & t = geta().getb(); Prawo Demeter metoda danego obiektu może odwoływać się jedynie do metod należących do: l tego samego obiektu, l dowolnego parametru przekazanego do niej, l dowolnego obiektu przez nią stworzonego, l dowolnego składnika klasy, do której należy dana metoda. https://pl.wikipedia.org/wiki/prawo_demeter

T const & t = geta().getb(); typedef Foo T; struct A T const & getb() const return this->member; T member; A geta() return A(); cout << "===== T const & t = geta().getb() =====" << endl; T const & t = geta().getb(); cout << t << endl; ===== T const & t = geta().getb() ===== Foo ~Foo <operator<< on Foo>

T const & t = geta().getb(); typedef Foo T; struct A T const & getb() const return this->member; T member; A geta() return A(); cout << "===== T const & t = geta().getb() =====" << endl; T const & t = geta().getb(); cout << t << endl; cout << "===== geta().getb() in function =====" << endl; cout << geta().getb() << endl; ===== T const & t = geta().getb() ===== Foo ~Foo <operator<< on Foo> ===== geta().getb() in function ===== Foo <operator<< on Foo> ~Foo

zupa(f1(), f2(), unique_ptr<...>(new...));

Kolejność ewaluacji wyrażeń zupa(f1(), f2(), unique_ptr<...>(new...)); new unique_ptr<> f2() f1() zupa

Kolejność ewaluacji wyrażeń zupa(f1(), f2(), unique_ptr<...>(new...)); new unique_ptr<> f2() f1() zupa new f1() f2() unique_ptr<> zupa Np. MS VC++ 2005 wyliczał wyrażenia w innej kolejności

Pozostałości z C int tab[5] = 1

Pozostałości z C int tab[5] = 1 -> int tab[5] = 1, 0, 0, 0, 0

Pozostałości z C char a = 65; unsigned char b = 66; signed char c = 67; cout << a << " " << b << " " << c << endl; cout << +a << " " << +b << " " << +c << endl;

Pozostałości z C char a = 65; unsigned char b = 66; signed char c = 67; cout << a << " " << b << " " << c << endl; cout << +a << " " << +b << " " << +c << endl; Output: A B C 65 66 67

Pozostałości z C char a = 65; unsigned char b = 66; signed char c = 67; cout << a << " " << b << " " << c << endl; cout << +a << " " << +b << " " << +c << endl; Output: A B C 65 66 67 Integer Promotion

Pozostałości z C char a = 65; unsigned char b = 66; signed char c = 67; Zagadka: c=a+++b; ++c=a+++b++; cout << a << " " << b << " " << c << endl; cout << +a << " " << +b << " " << +c << endl; Output: A B C 65 66 67 Integer Promotion

Templates void exit(int); template <typename T> class Base public: void exit(); template <typename T> class Derived : Base<T> public: void foo() exit(); // error: too few arguments to function void exit(int) Nicolai M. Josuttis, 2002, C++ Templates, The complete guide,

Templates - szukanie nazw void exit(int); template <typename T> class Base public: void exit(); template <typename T> class Derived : Base<T> public: void foo() this->exit(); Nicolai M. Josuttis, 2002, C++ Templates, The complete guide,

struct ClassToBind void g(classtobind const &) ClassToBind() ClassToBind(ClassToBind const &) cout << "" << endl; typedef function<void (void) > Func; void f(func)

struct ClassToBind void g(classtobind const &) ClassToBind() ClassToBind(ClassToBind const &) cout << "" << endl; typedef function<void (void) > Func; void f(func) cout << "====boost::bind====" << endl; ClassToBind tobind; Func func1 = boost::bind(&classtobind::g, &tobind, tobind); cout << "====func2====" << endl; Func func2 = boost::bind(&f, func1); cout << "====func3====" << endl; Func func3 = boost::bind(&f, func2);

struct ClassToBind void g(classtobind const &) ClassToBind() ClassToBind(ClassToBind const &) cout << "" << endl; typedef function<void (void) > Func; void f(func) cout << "====boost::bind====" << endl; ClassToBind tobind; Func func1 = boost::bind(&classtobind::g, &tobind, tobind); cout << "====func2====" << endl; Func func2 = boost::bind(&f, func1); cout << "====func3====" << endl; Func func3 = boost::bind(&f, func2); ====boost::bind==== ====func2==== ====func3====

struct ClassToBind void g(classtobind const &) ClassToBind() ClassToBind(ClassToBind const &) cout << "" << endl; typedef function<void (void) > Func; void f(func) cout << "====boost::bind====" << endl; ClassToBind tobind; Func func1 = boost::bind(&classtobind::g, &tobind, tobind); cout << "====func2====" << endl; Func func2 = boost::bind(&f, func1); cout << "====func3====" << endl; Func func3 = boost::bind(&f, func2); ====boost::bind==== ====func2==== ====func3==== Każdy boost::bind woła 5 razy kontruktor kopiujący dla każdego parametru Każda std::function to jedna alokacja

struct ClassToBind void g(classtobind const &) ClassToBind() ClassToBind(ClassToBind const &) cout << "" << endl; typedef function<void (void) > Func; void f(func) cout << "====std::bind====" << endl; ClassToBind tobind; Func func1 = std::bind(&classtobind::g, &tobind, tobind); cout << "====func2====" << endl; Func func2 = std::bind(&f, func1); cout << "====func3====" << endl; Func func3 = std::bind(&f, func2); ====std::bind==== ====func2==== ====func3====

https://octoverse.github.com/

C++ zarządzanie pamięcią Wycieki pamięci Segmentation fault Memory corruption Null pointer exception Zapobieganie fragmentacji pamięci

C++ kompatybilny z C Pozostałości w składni sprzed 35 lat Integer promotion

C++ język wieloplatformowy Rozmiar longa może być różny Standard nie precyzuje wszystkiego Kompilatory różnią się od siebie np kolejnością ewaluacji wyrażeń

Bogactwo C++ Wybierasz czego chcesz użyć std::bind czy boost::bind? Łatwo napisać nieczytelny kod

C++ wydajność Wymagane zarządzanie pamięcią Bardziej wydajny niż inne języki? Czy wszystkie miejsca w kodzie muszą być tak samo wydajne? Przedwczesna optymalizacja?

Testy Writing unit tests in Go or Java is quite easy and natural, whereas in C++ it can be very difficult (and it isn t exactly ingrained in C++ culture to write unit tests) - https://testing.googleblog.com/2016/08/hackable-projects.html By: Patrik Höglund Compilation time, IDE support, test frameworks 2004, Michael Feathers, Working Effectively with Legacy Code CppUnit, CppUnitLite, Google Test

Szybkość pisania kodu IDE Produkt w 2 tygodnie?

Wnioski C++ to trudny język Jeśli można to wybierz język z zarządzaniem pamięcią Nie optymalizuj za wcześnie Pisz ładny i prosty kod

Dziękuję.