Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Redaktor prowadzący: Michał Mrowiec Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie?cwcp11 Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Kody źródłowe wybranych przykładów dostępne są pod adresem: ftp://ftp.helion.pl/przyklady/cwcp11.zip ISBN: 978-83-246-3935-9 Copyright Helion 2012 Printed in Poland. Kup książkę Poleć książkę Oceń książkę Księgarnia internetowa Lubię to!» Nasza społeczność
Spis tre ci Wst p 5 Rozdzia 1. Narz dzia programistyczne 9 Rozdzia 2. S owo kluczowe auto, czyli kompilator okre la typ 13 Rozdzia 3. S owo kluczowe decltype, czyli typ taki sam jak tamten 19 Rozdzia 4. S owo kluczowe constexpr, czyli wyra enia sta e 23 Rozdzia 5. S owo kluczowe nullptr 31 Rozdzia 6. Lepsze typy wyliczeniowe enum class 35 Rozdzia 7. Inicjalizowanie tablic 39 Rozdzia 8. Inicjalizowanie klas na podobie stwo tablic 47 Rozdzia 9. Krotki (rekordy) 53 Rozdzia 10. Metody oznaczone default lub delete 61 Rozdzia 11. Bezpieczne wska niki unique_ptr i shared_ptr 69 Rozdzia 12. Kopiowanie i przenoszenie 79 Rozdzia 13. P tla for(... :...) dla kolekcji danych 87 Rozdzia 14. Prostsze tworzenie obiektów 91
4 C++11. Nowy standard wiczenia Rozdzia 15. S owo kluczowe explicit i mocniejsza ochrona przed przypadkowymi konwersjami 95 Rozdzia 16. Operator sizeof() zna rozmiary elementów klasy 99 Rozdzia 17. Szablony ze zmienn liczb argumentów 101 Rozdzia 18. Funkcje i wyra enia lambda 113 Zako czenie 123
13 P tla for(... :...) dla kolekcji danych Standard c++11 wprowadza uproszczon p tl for(...), przebiegaj c przez ca kolekcj podan jako argument. P tla ta jest odpowiednikiem znanej z innych j zyków p tli foreach(...) rób co dla ka dego elementu kolekcji. W I C Z E N I E 13.1 Wypisanie wszystkich elementów tablicy za pomoc nowej p tli for(...) Zadeklaruj tablic i za pomoc nowej p tli for() dla kolekcji wyprowad na ekran jej elementy (rysunek 13.1):... int tablica[5] = 1, 2, 3, 4, 5}; for(int element : tablica) cout << element << endl; }... Nowa p tla for() ma dwa pola: pole okre lenia zmiennej o typie zgodnym z typami w tablicy i pole okre lenia samej tablicy.
88 C++11. Nowy standard wiczenia Rysunek 13.1. Nowa p tla for() przebiega po tablicy i wy wietla jej elementy W I C Z E N I E 13.2 Modyfikacja wszystkich elementów tablicy za pomoc nowej p tli for(...) Zadeklaruj dla odmiany tablic vector i za pomoc nowej p tli for() dla kolekcji zmodyfikuj elementy kolekcji:... #include <vector>... int main() vector<double> v=1, 2, 3}; for( double &r : v) r = 3.14; } cout << v[ 0] << ", " << v[ 1] << ", " << v[ 2] << endl; system("pause"); return EXIT_SUCCESS; } W stosunku do poprzedniego wiczenia zmienna robocza r zosta a zadeklarowana jako referencja (odwo anie) i p tla for dla kolekcji umieszcza pod ni kolejno wszystkie elementy tablicy. Modyfikacja referencji oznacza modyfikacj oryginalnego elementu tablicy. Rysunek 13.2. Modyfikacja kolekcji za pomoc nowej p tli dla zakresów dla kolekcji
Rozdzia 13. P tla for(... :...) dla kolekcji danych 89 Podsumowanie Wi kszo iteracji po kolekcjach odbywa si od pocz tku do ko ca. Dlaczego t p tl otrzymali my tak pó no?
90 C++11. Nowy standard wiczenia
14 Prostsze tworzenie obiektów W standardzie c++11 znajdujemy dwa nowe drobiazgi: zadeklarowane w typach u ytkownika (klasach, strukturach) dane mog by inicjalizowane bezpo rednio, a nie jak dot d w konstruktorach; konstruktory typów u ytkownika mog wywo ywa inne konstruktory, co dotychczas te by o zabronione. W I C Z E N I E 14.1 Inicjalizowanie ustroju klasy bezpo rednio i za pomoc konstruktorów Zadeklaruj klas, w której zademonstrujesz zarówno bezpo rednie inicjalizowanie zmiennej, jak i stare rozwi zanie czyli inicjalizacj zmiennej za pomoc konstruktora:... class Stara public: int a; Stara():a( 17)cout << "Konstruktor" << endl;} };
92 C++11. Nowy standard wiczenia class Nowa public: int a = 17; Nowa() cout << "Konstruktor" << endl;} }; int main() Stara s; cout << s.a << endl; Nowa n; cout << n.a << endl; system("pause"); return EXIT_SUCCESS; } Dwie klasy maj pewn zmienn. Klasa Stara inicjalizuje t zmienn za pomoc do tej pory jedynej dost pnej metody, czyli w konstruktorze (tutaj za pomoc tzw. listy inicjalizacyjnej konstruktora). Klasa Nowa inicjalizuje swoj zmienn przez bezpo rednie przypisanie warto ci w momencie deklaracji klasy. Konstruktory mog ewentualnie zmieni t warto. Rysunek 14.1. Niestety, kompilator jeszcze nie zna bezpo redniego inicjalizowania. Zgodnie z dotychczasowym standardem j zyka domaga si, by bezpo rednio inicjalizowana zmienna by a statyczna i sta a W I C Z E N I E 14.2 Konstruktor mo e inicjalizowa klas przez wywo anie innego konstruktora Przygotuj klas i zaopatrz j w takie konstruktory, by jeden z nich wywo ywa inny:... class T
Rozdzia 14. Prostsze tworzenie obiektów 93 private: int a; public: T():a( 17)cout << "Konstruktor 'T()'" << endl;} T( double r):t()cout << "Konstruktor 'T( double r)'" << endl;} }; int main() T a; T b( 3.14); system("pause"); return EXIT_SUCCESS; } Typ T w konstruktorze z argumentem wywo uje inny konstruktor tej e klasy. Do tej pory nie by o to mo liwe ka dy konstruktor musia przeprowadza niezale nie inicjalizacj obiektu. Konstruktor móg wywo ywa innego konstruktora tylko w obr bie drzewa dziedziczenia. Mówi c inaczej konstruktor klasy pochodnej wywo ywa konstruktora klasy bazowej. W obr bie jednej klasy takie wywo ania by y niemo liwe. Rysunek 14.2. Kompilator jeszcze nie realizuje opisywanego tu usprawnienia. Komunikat g osi, e wywo anie konstruktora przez konstruktor by oby mo liwe, gdyby nasza klasa dziedziczy a po sobie samej Podsumowanie Chyba ka dy m ody programista, który deklarowa pierwsz klas w swoim yciu, zastanawia si, dlaczego nie mo e zainicjowa jej pól warto ciami. By yby to jakby warto ci domy lne, wst pne, które konstruktory mog zmieni.
94 C++11. Nowy standard wiczenia Dodatkowo otrzymujemy mechanizm wywo ywania jednego konstruktora przez innego. Je li obydwa konstruktory tak samo (lub podobnie) inicjalizuj klas po co mamy powtarza ten sam kod?