background image
background image

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ść

background image

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ę

background image

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ę

background image

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ę

background image

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 

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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 

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ę

background image

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ę

background image
background image