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.
Spis treci
Wstp
5
Rozdzia 1. Narzdzia programistyczne
9
Rozdzia 2. Sowo kluczowe auto, czyli kompilator okrela typ
13
Rozdzia 3. Sowo kluczowe decltype, czyli typ taki sam jak tamten
19
Rozdzia 4. Sowo kluczowe constexpr, czyli wyraenia stae
23
Rozdzia 5. Sowo kluczowe nullptr
31
Rozdzia 6. Lepsze typy wyliczeniowe enum class
35
Rozdzia 7. Inicjalizowanie tablic
39
Rozdzia 8. Inicjalizowanie klas na podobiestwo tablic
47
Rozdzia 9. Krotki (rekordy)
53
Rozdzia 10. Metody oznaczone default lub delete
61
Rozdzia 11. Bezpieczne wskaniki unique_ptr i shared_ptr
69
Rozdzia 12. Kopiowanie i przenoszenie
79
Rozdzia 13. Ptla for( ... : ...) dla kolekcji danych
87
Rozdzia 14. Prostsze tworzenie obiektów
91
Kup książkę
Poleć książkę
4
C + + 1 1 . N o w y s t a n d a r d • w i c z e n i a
Rozdzia 15. Sowo 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 wyraenia lambda
113
Zakoczenie
123
Poleć książkę
Kup książkę
13
Ptla for( ... : ...)
dla kolekcji danych
Standard c++11 wprowadza uproszczon ptl
for( ...)
, prze-
biegajc przez ca kolekcj podan jako argument. Ptla ta jest
odpowiednikiem znanej z innych jzyków ptli
foreach( ...)
— rób co dla kadego elementu kolekcji.
W I C Z E N I E
13.1
Wypisanie wszystkich elementów tablicy za pomoc
nowej ptli for( ...)
Zadeklaruj tablic i za pomoc nowej ptli
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 ptla
for()
ma dwa pola: pole okrelenia zmiennej o typie zgod-
nym z typami w tablicy i pole okrelenia samej tablicy.
Poleć książkę
Kup książkę
8 8
C + + 1 1 . N o w y s t a n d a r d • w i c z e n i a
Rysunek 13.1. Nowa ptla for() przebiega po tablicy i wywietla jej elementy
W I C Z E N I E
13.2
Modyfikacja wszystkich elementów tablicy
za pomoc nowej ptli for( ...)
Zadeklaruj dla odmiany tablic
vector
i za pomoc nowej ptli
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
zostaa za-
deklarowana jako referencja (odwoanie) i ptla
for
dla kolekcji umiesz-
cza pod ni kolejno wszystkie elementy tablicy. Modyfikacja referencji
oznacza modyfikacj oryginalnego elementu tablicy.
Rysunek 13.2. Modyfikacja kolekcji za pomoc nowej ptli dla zakresów
dla kolekcji
Poleć książkę
Kup książkę
R o z d z i a 1 3 . • P t l a f o r ( . . . : . . . ) d l a k o l e k c j i d a n y c h
8 9
Podsumowanie
Wikszo iteracji po kolekcjach odbywa si „od pocztku do koca”.
Dlaczego t ptl otrzymalimy tak póno?
Poleć książkę
Kup książkę
9 0
C + + 1 1 . N o w y s t a n d a r d • w i c z e n i a
Poleć książkę
Kup książkę
14
Prostsze tworzenie
obiektów
W standardzie c++11 znajdujemy dwa nowe drobiazgi:
T
zadeklarowane w typach uytkownika (klasach, strukturach) dane
mog by inicjalizowane bezporednio, a nie — jak dotd —
w konstruktorach;
T
konstruktory typów uytkownika mog wywoywa inne
konstruktory, co dotychczas te byo zabronione.
W I C Z E N I E
14.1
Inicjalizowanie ustroju klasy bezporednio
i za pomoc konstruktorów
Zadeklaruj klas, w której zademonstrujesz zarówno bezporednie ini-
cjalizowanie zmiennej, jak i stare rozwizanie — czyli inicjalizacj
zmiennej za pomoc konstruktora:
...
class Stara
{
public:
int a;
Stara():a( 17){cout << "Konstruktor" << endl;}
};
Poleć książkę
Kup książkę
9 2
C + + 1 1 . N o w y s t a n d a r d • w i c z e n i a
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 dostpnej metody, czyli w konstruktorze
(tutaj za pomoc tzw. listy inicjalizacyjnej konstruktora). Klasa
Nowa
inicjalizuje swoj zmienn przez bezporednie przypisanie wartoci
w momencie deklaracji klasy. Konstruktory mog ewentualnie zmieni
t warto.
Rysunek 14.1. Niestety, kompilator jeszcze nie zna bezporedniego
inicjalizowania. Zgodnie z dotychczasowym standardem jzyka domaga si,
by bezporednio inicjalizowana zmienna bya statyczna i staa
W I C Z E N I E
14.2
Konstruktor moe inicjalizowa klas przez wywoanie
innego konstruktora
Przygotuj klas i zaopatrz j w takie konstruktory, by jeden z nich wy-
woywa inny:
...
class T
{
Poleć książkę
Kup książkę
R o z d z i a 1 4 . • P r o s t s z e t w o r z e n i e o b i e k t ó w
9 3
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 wywouje inny konstruktor teje
klasy. Do tej pory nie byo to moliwe — kady konstruktor musia
przeprowadza niezalenie inicjalizacj obiektu. Konstruktor móg wy-
woywa innego konstruktora tylko w obrbie drzewa dziedziczenia.
Mówic inaczej — konstruktor klasy pochodnej wywoywa konstruk-
tora klasy bazowej. W obrbie jednej klasy takie wywoania byy nie-
moliwe.
Rysunek 14.2. Kompilator jeszcze nie realizuje opisywanego tu usprawnienia.
Komunikat gosi, e wywoanie konstruktora przez konstruktor byoby moliwe,
gdyby nasza klasa dziedziczya po sobie samej
Podsumowanie
Chyba kady mody programista, który deklarowa pierwsz klas
w swoim yciu, zastanawia si, dlaczego nie moe zainicjowa jej pól
wartociami. Byyby to jakby wartoci domylne, wstpne, które kon-
struktory mog zmieni.
Poleć książkę
Kup książkę
9 4
C + + 1 1 . N o w y s t a n d a r d • w i c z e n i a
Dodatkowo otrzymujemy mechanizm wywoywania jednego konstruk-
tora przez innego. Jeli obydwa konstruktory tak samo (lub podobnie)
inicjalizuj klas — po co mamy powtarza ten sam kod?
Poleć książkę
Kup książkę