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

Podobne dokumenty
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

C++ 11: C++ 11: C++11: jednolita inicjalizacja. C++11: jednolita inicjalizacja. C++11: jednolita inicjalizacja. C++11: initializer_list

STL: kontenery C++: STL: kontenery. STL: kontenery. STL: kontenery. STL: kontenery. Fabryka obiektów. Fabryka obiektów. Fabryka obiektów przykład:

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

Programowanie obiektowe w C++ Wykład 12

Języki i techniki programowania Ćwiczenia 2

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

Programowanie i struktury danych

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

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

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

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

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

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

Język C++ wykład VIII

Szablony klas, zastosowanie szablonów w programach

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

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

Wprowadzenie do szablonów szablony funkcji

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Wykład 4: Klasy i Metody

Wprowadzenie do szablonów szablony funkcji

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

Część 4 życie programu

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

Nowoczesny C++ Rafał Wasilewski 1

Zaawansowane programowanie w C++ (PCP)

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

PARADYGMATY PROGRAMOWANIA Wykład 4

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

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

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Projektowanie klas c.d. Projektowanie klas przykład

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

PARADYGMATY PROGRAMOWANIA Wykład 2

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

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

Przeciążenie (przeładowanie nazw) funkcji

Standard C++0x (C++1x?) Marcin Świderski

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

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Język C++ zajęcia nr 2

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Programowanie w języku C++

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Programowanie, część I

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

PARADYGMATY PROGRAMOWANIA Wykład 3

Szablony. Szablony funkcji

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

Zaawansowane programowanie w C++ (PCP)

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

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

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

Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40

Jak Windows zarządza pamięcią?

Szablony funkcji i szablony klas

Podstawy programowania skrót z wykładów:

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

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

C++ wprowadzanie zmiennych

I - Microsoft Visual Studio C++

Szablon klasy std::vector

Plik klasy. h deklaracje klas

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Technologie programowania Wykład 4. Szablony funkcji Notes. Szablony funkcji Notes. Szablony funkcji Notes. Notes. Przemek Błaśkiewicz.

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

Przekazywanie argumentów wskaźniki

Wyliczanie wyrażenia obiekty tymczasowe

Przeciążenie operatorów

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Programowanie Obiektowe i C++

Słowa kluczowe i nazwy

TEMAT : KLASY DZIEDZICZENIE

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

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

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Programowanie obiektowe. Materiały przygotował: mgr inż. Wojciech Frohmberg

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Konstruktor kopiujacy

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

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

C++ Przeładowanie operatorów i wzorce w klasach

Kurs programowania. Wykład 9. Wojciech Macyna

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Podstawowe części projektu w Javie

Materiały do zajęć VII

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

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

Język ludzki kod maszynowy

Transkrypt:

C++ 11 wybrane elementy C++11 Lista rozszerzeń C++11 obecnych w VC2013: 1. Referencje do rvalue, 2. Jednolite inicjowanie i delegowanie konstruktorów, 3. Konstruktory delegujące 4. Jednolita inicjalizacja 5. Klasa initializer_list 6. static_assert 7. Domyślne wartości parametrów szablonu dla szablonów funkcji 8. Szablony ze zmienną liczbą parametrów 9. typedef i aliasy 10. Szablony zewnętrzne 11. Pętla for oparta na zakresie, 12. Dedukcja typów danych, 13. Sprytne wskaźniki, 14. nullptr 15. Kontenery mieszające (kontenery z haszowaniem). 2 lvalue i rvalue lvalue - wyrażenie które odnosi się do obszaru pamięci (obiektu, który ma nazwę) i pozwala na pozyskanie adresu tego obszaru za pomocą operatora & rvalue - wyrażenie nie będące lvalue Referencje do rvalue int foobar(); int j = 0; j = foobar(); int* p2 = &foobar(); j = 42; // ok, foobar() jest rvalue // błąd, nie można pobrać adresu // ok, 42 jest rvalue 4 Przykładowy problem Przyjmijmy, że mamy klasę w której jedno z pól jest wskaźnikiem m_presource np. do pewnego kontenera. Przeciążony operator kopiowania dla tej klasy: X& X::operator=(X const & rhs) { // zniszcz zasób wskazywany przez m_presource // sklonuj to, na co wskazuje rhs.m_presource // dołącz klon do m_presource. Teraz można wywołać kod: X foo(); // dana jest pewna funkcja foo.. X x; x = foo(); // wywołanie przeciążonego operatora przypisania 5 Przykładowy problem (move semantics) Zdecydowanie mniejszy nakład pracy dałby taki przeciążony operator: // swap ( m_presource, rhs.m_presource ) To jest właśnie semantyka przenoszenia danych (move semantics) pozwolenie pewnemu obiektowi, pod pewnymi warunkami przejąć kontrolę nad zewnętrznymi zasobami innego obiektu. Dzięki temu unikamy kosztownych kopiowań. Żeby swap zadziałało, potrzebujemy, aby argument operatora był referencją. Jeżeli argument jest lvalue nie ma problemu. A jeżeli argument jest rvalue?.... wtedy przydałby się drugi referencyjny typ danych, który byłby wybierany, kiedy argumentem jest rvalue: && 6 1

Przykładowy problem (move semantics) Rozwiązanie: void foo(x& x) {.. ; void foo(x&& x) {.. ; X x; X foobar() {.. ; return..; ; // wersja z referencją do lvalue // wersja z referencją do rvalue foo(x); // argument jest lvalue: wywołuje foo(x&) foo(foobar()); // argument jest rvalue: wywołuje foo(x&&) Na etapie kompilacji rozstrzyga się, jaki argument zostanie podany w wywołaniu. Przykładowy problem (move semantics) Rozwiązanie dla przeciążonego operatora przypisania: X& X::operator=(X const & rhs); // klasyczna implementacja X& X::operator=(X&& rhs) { // Move semantics: zamiana zawartości pomiędzy this i rhs //.. return *this; Uwaga: tak, to prawda, że && można stosować w dowolnej funkcji, ale przyjmuje się stosowanie wyłącznie do przeciążonych operatorów przypisania i konstruktorów kopiujących. 7 8 Semantyka przenoszenia danych Czy zmienna referencyjna do rvalue jest traktowana jako rvalue? Przykład: void foo(x&& x) { X anotherx = x; // który operator przypisania zadziała? //... (x jest referencją do rvalue, więc powinien operator=(x&& x)..) Nie. Prosta zasada mówi: jeżeli coś ma nazwę, to jest lvalue. W przeciwnym razie jest rvalue. Konstruktory delegujące 9 C++11: konstruktory delegujące C++11: konstruktory delegujące Delegowanie: Problem: w C++98 jest dana klasa, która ma kilka konstruktorów. Często część kroków inicjalizujących powtarza się w każdym z nich, np.: A(): num1(0), num2(0) {average=(num1+num2)/2; A(int i): num1(i), num2(0) {average=(num1+num2)/2; A(int i, int j): num1(i), num2(j) {average=(num1+num2)/2; ; 11 Delegowanie: W C++11 dostajemy możliwość stworzenia jednego konstruktora docelowego i kilku delegujących: A(): A(0){ // A() deleguje do A(0) A(int i): A(i, 0){ // A(int i) deleguje do A(i,0) A(int i, int j) { num1=i; num2=j; average=(num1+num2)/2; ; Uwaga: w konstruktorach delegujących nie wolno w liście inicjalizatorów konstruktora dodawać instrukcji inicjalizacji pól 12 2

C++11: konstruktory delegujące Delegowanie i wyjątki: Wywołanie docelowego konstruktora może być zamknięte w bloku try: A(); A(int i); A(int i, int j); ; A:: A()try: A(0) { cout << "A() body"<< endl; catch(...) { cout << "A() catch"<< endl; A::A(int i) try: A(i, 0){ cout << "A(int i) body"<< endl; catch(...) { cout << "A(int i) catch"<< endl; 13 C++11: konstruktory delegujące Delegowanie i wyjątki: Wywołanie docelowego konstruktora może być zamknięte w bloku try: A(); A(int i); A(int i, int j); ; A::A(int i, int j) try { num1=i; num2=j; average=(num1+num2)/2; cout << "A(int i, int j) body"<< endl; throw 1; catch(...) { cout << "A(int i, int j) catch"<< endl; 14 C++11: jednolita inicjalizacja Jednolita inicjalizacja za pomocą nawiasów klamrowych: Możliwa do zastosowania do dowolnej klasy, struktury czy unii, o ile istnieje (zdefiniowany jawnie lub implicite) konstruktor domyślny: Jednolita inicjalizacja class class_a { int main() { class_a() { // konstruktor domyślny class_a c1{; class_a(string str) : class_a c1_1; m_string{ str { class_a c2{ "ww" ; class_a(string str, double dbl) : class_a c2_1("xx"); m_string{ str, class_a c3{ "yy", 4.4 ; m_double{ dbl { class_a c3_1("zz", 5.5); double m_double; Kolejność argumentów jak w string m_string; konstruktorze, ponieważ ta ; inicjalizacja de facto wywołuje konstruktor 16 C++11: jednolita inicjalizacja Jednolita inicjalizacja za pomocą nawiasów klamrowych: Jeżeli nie zdefiniowano żadnego konstruktora, domyślny porządek argumentów taki jak pól w deklaracji klasy/struktury/unii: class class_d { float m_float; string m_string; wchar_t m_char; ; int main() { class_d d1{; class_d d1{ 4.5 ; class_d d2{ 4.5, "string" ; class_d d3{ 4.5, "string", 'c' ; class_d d4{ "string", 'c' ; // błąd class_d d5("string", 'c', 2.0 ; // błąd C++11: jednolita inicjalizacja Jednolita inicjalizacja za pomocą nawiasów klamrowych: Można jej używać w dowolnym miejscu kodu: class_d* cf = new class_d{4.5; kr->add_d({ 4.5 ); return { 4.5 ; 17 18 3

C++11: initializer_list Lista obiektów do inicjalizacji: Klasa reprezentuje listę obiektów jednego, określonego typu, które mogą być używane w konstruktorze i innych inicjalizujących kontekstach Klasa initializer_list #include <initializer_list>.. initializer_list<int> ilist1{ 5, 6, 7 ; initializer_list<int> ilist2( ilist1 ); if (ilist1.begin() == ilist2.begin()) cout << "tak!" << endl; // spodziewamy się "tak!" Standardowe klasy kontenerów z STL, a także np. string mają zdefiniowane konstruktory przyjmujące jako argument listę obiektów. 20 C++11: initializer_list C++11: initializer_list Lista obiektów do inicjalizacji: Można używać list w konstruktorach własnych klas: class C { list<int> L; C(const std::initializer_list<int>& v) : L(v.begin(), v.end()) { ; int main() { C c{ 3, 5, 7, 11 ;.. // inicjalizujemy listą wartości Lista obiektów do inicjalizacji: Można używać list do inicjalizacji klas kontenerów wyrażeniami z nawiasami klamrowymi vector<int> v1{ 9, 10, 11 ; map<int, string> m1{ {1, "a", {2, "b" ; string s{ 'a', 'b', 'c' ; 21 22 C++11: static_assert Testuje zadane wyrażenie na etapie kompilacji static_assert Składnia: static_assert( constant-expression, string-literal ); Jeżeli constant-expression zwraca false, wypisywany jest komunikat string-literal, a kompilacja kończy się niepowodzeniem, 24 4

C++11: static_assert C++11: static_assert Przykłady użycia Jeżeli nieprawda, że rozmiar =4, czyli, że architektura nie jest 32- bitowa, tzn. że musi być 64- bitowa,a tej nie wspieramy.. Przykłady użycia static_assert(sizeof(void *) == 4, "64-bit code generation is not supported."); Jeżeli nieprawda, że wersja > 2, tzn. że musi być 2 lub mniej, a tej już nie wspieramy.. class Foo { static const int bar = 3; // prowokujemy błąd.. ; static_assert(foo::bar > 4, "Foo::bar is too small :("); static_assert(somelibrary::version > 2, "Old versions of SomeLibrary are missing the foo functionality. Cannot proceed!"); int main() { return Foo::bar; 25 26 C++11: static_assert Przykłady użycia template < class T, int Size > class Vector { static_assert(size > 3, "Vector size is too small!"); T m_values[size]; ; int _tmain(int argc, _TCHAR* argv[]) { Vector< int, 4 > four; // prawda, że: Size>3 Vector< short, 2 > two; // nieprawda, że: Size>3 - błąd return 0; Domyślne wartości parametrów szablonu dla szablonów funkcji 27 C++11: domyślne argumenty szablonu C++11: domyślne argumenty szablonu Domyślne wartości parametrów szablonu dla szablonów funkcji: W C++98 w szablonach klas dozwolone były domyślne argumenty szablonu. W szablonach funkcji nie. Zaczynając od VS2013 wolno nam: template <typename T = int> void Foo(T t = 0) { Foo(12L); // Foo<long> Foo(12.1); // Foo<double> Foo('A'); // Foo<char> Foo(); // Foo<int> (!) Domyślne wartości parametrów szablonu dla szablonów funkcji: template <typename T> class Manager { void Process(T t) { ; template <typename T> class AltManager { void Process(T t) { ; template <typename T, typename M=Manager<T>> void Manage(T t) { M m; m.process(t); Manage(25); // Manage<int, Manager<int>> Manage<int, AltManager<int>>(25); // Manage<int, AltManager<int>> 29 30 5

C++11: domyślne argumenty szablonu Domyślne wartości parametrów szablonu dla szablonów funkcji: Trzeba jednak uważać na niejednoznaczności: template <typename T = int> void Foo(T t = 0) { template <typename B, typename T = int> void Foo(B b = 0, T t = 0) { Foo(12L); Foo(12.1); Foo('A'); Foo(); // nie skompiluje się // nie skompiluje się // nie skompiluje się // Foo<int> 31 6