kocka

DEMISTIFICIRANI C++ (3. prošireno izdanje)

Provjerite zašto "pravi programeri" koriste C++

Sadržaj

piramidica 0. To C++ or not to C++? 1

0.1. Povijesni pregled razvoja programskih jezika ... 1
0.2. Osnovna svojstva jezika C++ ... 3
0.3. Usporedba s C-om ... 6
0.4. Usporedba s Javom ... 8
    0.4.1. Java je potpuno objektno orijentirani programski jezik ... 8
    0.4.2. Java kôd se izvodi na virtualnom stroju ... 9
    0.4.3. Java nema pokazivača ... 10
    0.4.4. Java nema višestrukog nasljeđivanja ... 10
    0.4.5. Java ima ugrađeno automatsko sakupljanje smeća ... 11
    0.4.6. Java podržava višenitnost ... 11
    0.4.7. Java ne podržava preopterećenje operatora ... 12
    0.4.8. U Javi su operacije s decimalnim brojevima lošije podržane ... 12
    0.4.9. Java ima na raspolaganju ogromnu biblioteku klasa ... 12
    0.4.10. Java je jezik u “vlasništvu” jedne tvrtke ... 12
0.5. Usporedba s jezikom C♯ ... 13
0.6. Ima li smisla učiti jezik C++? ... 13
0.7. Zašto primjer iz knjige ne radi na mom računalu? ... 13
0.8. Literatura ... 14
0.9. Zahvale ... 16
    0.9.1. Zahvale uz drugo i treće izdanje ... 16

piramidica 1. Vrijeme je da se krene... 17

1.1. Što je program i kako ga napisati ... 17
1.2. Boj ne bije svjetlo oružje, već srce u junaka ... 21
    1.2.1. Prevoditelj ... 21
    1.2.2. Program za uređivanje teksta ... 22
    1.2.3. Program za otkrivanje pogrešaka ... 22
1.2. Moj prvi i drugi C++ program ... 22
1.3. Moj treći C++ program ... 28
1.4. Komentari ... 30
1.5. Rastavljanje naredbi ... 32

piramidica 2. Osnovni tipovi podataka 35

2.1. Identifikatori ... 35
2.2. Varijable, objekti i tipovi ... 37
2.3. Operator pridruživanja ... 40
2.4. Tipovi podataka i operatori ... 41
    2.4.1. Brojevi ... 41
    2.4.2. Aritmetički operatori ... 47
    2.4.3. Operator dodjele tipa ... 53
    2.4.4. Dodjeljivanje tipa brojčanim konstantama ... 55
    2.4.5. Simboličke konstante ... 56
    2.4.6. Kvalifikator volatile ... 58
    2.4.7. Pobrojenja ... 59
    2.4.8. Logički tipovi i operatori ... 61
    2.4.9. Poredbeni operatori ... 64
    2.4.10. Znakovi ... 65
    2.4.11. Bitovni operatori ... 69
    2.4.12. Operatori pridruživanja (2 ½) ... 76
    2.4.13. Alternativne oznake operatora ... 77
    2.4.14. Korisnički definirani tipovi i operatori ... 78
    2.4.15. Deklaracija typedef ... 79
2.5. Operator sizeof ... 80
2.6. Operator razdvajanja ... 81
2.7. Hijerarhija i redoslijed izvođenja operatora ... 82

piramidica 3. Naredbe za kontrolu toka programa 87

3.1. Blokovi naredbi ... 87
3.2. Grananje toka naredbom if ... 89
3.3. Uvjetni operator ? : ... 94
3.4. Grananje toka naredbom switch ... 95
3.5. Petlja for ... 99
3.6. Naredba while ... 104
3.7. Blok do-while ... 106
3.8. Naredbe break i continue ... 108
3.9. Ostale naredbe za skok ... 112
3.10. O strukturiranju izvornog kôda ... 112
3.11. Kutak za buduće C++ “gurue” ... 114

piramidica 4. Nizovi, pokazivači, reference 119

4.1. Nizovi podataka ... 119
    4.1.1. Jednodimenzionalni nizovi ... 120
    4.1.2. Dvodimenzionalni nizovi ... 126
4.2. Pokazivači ... 133
    4.2.1. Koja korist od pokazivača, ako samo izazivaju probleme? ... 139
    4.2.2. Nul-pokazivači ... 140
    4.2.3. Kamo sa zvijezdom (petokrakom) ... 143
    4.2.4. Tajna veza između pokazivača i nizova ... 144
    4.2.5. Aritmetičke operacije s pokazivačima ... 147
    4.2.6. Dinamička alokacija objekata ... 151
    4.2.7. Razlika između automatske i dinamičke alokacija objekata ... 155
    4.2.8. Jednostavni primjeri curenja memorije i kako ju izbjeći ... 159
    4.2.9. Dinamička alokacija nepromjenjivih objekata ... 161
    4.2.10. Dinamička alokacija niza ... 161
    4.2.11. Dinamička alokacija višedimenzionalnih nizova ... 166
    4.2.12. Pokazivači na pokazivače ... 167
    4.2.13. Korištenje klase vector za nizove podataka ... 169
4.3. Nepromjenjivi pokazivači i pokazivači na nepromjenjive objekte ... 170
4.4. Znakovni nizovi ... 172
    4.4.1. Nizovi znakovnih nizova ... 177
    4.4.2. Razred string ... 178
4.5. Reference ... 179
    4.5.13. Reference za hakere ... 180
4.6. Nevolje s pokazivačima ... 181
4.7. Skraćeno označavanje izvedenih tipova ... 185

piramidica 5. Funkcije 187

5.1. Što su i zašto koristiti funkcije ... 187
5.2. Deklaracija i definicija funkcije ... 189
    5.2.1. Deklaracije funkcija u datotekama zaglavlja ... 192
5.3. Tip funkcije ... 195
5.4. Lista argumenata ... 198
    5.4.1. Funkcije bez argumenata ... 198
    5.4.2. Prijenos argumenata po vrijednosti ... 198
    5.4.3. Referenca kao argument ... 201
    5.4.4. Pokazivač kao argument ... 204
    5.4.5. Promjena pokazivača unutar funkcije ... 207
    5.4.6. Konstantni argumenti ... 205
    5.4.7. Nizovi kao argumenti ... 213
    5.4.8. Podrazumijevani argumenti ... 216
    5.4.9. Funkcije s neodređenim brojem argumenata ... 219
5.5. Pokazivači i reference kao povratne vrijednosti ... 224
5.6. Život jednog objekta ... 227
    5.6.1. Lokalni objekti ... 228
    5.6.2. Globalni objekti ... 229
    5.6.3. Statički objekti u funkcijama ... 232
5.7. Umetnute funkcije ... 234
5.8. Preopterećenje funkcija ... 235
5.9. Rekurzija ... 241
5.10. Pokazivači na funkcije ... 244
5.11. Funkcija main() ... 250
5.12. Standardne funkcije ... 252
    5.12.1. Funkcije za rukovanje znakovnim nizovima ... 254
    5.12.2. Funkcija exit() ... 260
5.13. Predlošci funkcija ... 261
5.14. Pogled na funkcije "ispod haube" ... 262
5.15. Kako pisati funkcionalne funkcije ... 264
    5.15.1. Funkcije doprinose modularnosti i olakšavaju testiranje ... 264
    5.15.2. Ova funkcija sadrži samo n-naredbi ... 265
    5.15.3. Koristiti već provjerene funkcije ... 265
    5.15.4. Imena funkcije i argumenata ... 266
    5.15.5. Argumenti i povratna vrijednost ... 266
    5.15.6. Provjera argumenata i signalizacija pogreške ... 266
    5.15.7. Princip dizajna prema ugovoru ... 267
    5.15.8. Koristiti automatizirane testove za provjeru ispravnosti ... 270

piramidica 6. Klase i objekti 273

6.1. Kako prepoznati klase? ... 273
6.2. Primjer korištenja klase ... 276
6.3. Definicija klase ... 278
    6.3.1. Podatkovni članovi ... 279
    6.3.2. Dohvaćanje članova objekta ... 281
    6.3.3. Funkcijski članovi ... 281
    6.3.4. Ključna riječ this ... 285
    6.3.5. Umetnuti funkcijski članovi ... 287
    6.3.6. Dodjela prava pristupa ... 288
    6.3.7. Formiranje javnog sučelja korištenjem prava pristupa ... 290
    6.3.8. Prijatelji razreda ... 292
6.4. Deklaracija objekata razreda ... 294
6.5. Stvaranje i uništavanje objekata ... 295
    6.5.1. Konstruktor ... 295
    6.5.2. Podrazumijevani konstruktor ... 303
    6.5.3. Poziv konstruktora prilikom definiranja objekata ... 305
    6.5.4. Konstruktor kopije ... 305
    6.5.5. Konstruktor pomaka ... 308
    6.5.6. Inicijalizacija referenci i konstantnih članova ... 310
    6.5.7. Konstruktori i prava pristupa ... 312
    6.5.8. Destruktor ... 314
    6.5.9. Globalni i statički objekti ... 317
6.6. Nizovi objekata ... 318
6.7. Konstantni funkcijski članovi ... 321
6.8. Funkcijski članovi deklarirani kao volatile ... 326
6.9. Statički članovi klase ... 326
    6.9.1. Statički podatkovni članovi ... 327
    6.9.2. Statički funkcijski članovi ... 330
6.10. Područje klase ... 332
    6.10.1. Razlučivanje područja ... 334
6.11. Ugniježđene klase ... 335
6.12. Lokalne klase ... 340
6.13. Pokazivači na članove klase ... 341
    6.13.1. Pokazivači na podatkovne članove ... 342
    6.13.2. Pokazivači na funkcijske članove ... 347
6.14. Privremeni objekti ... 350
    6.14.1. Eksplicitno stvoreni privremeni objekti ... 350
    6.14.2. Privremeni objekti kod prijenosa parametara u funkciju ... 354
    6.14.3. Privremeni objekti kod vraćanja vrijednosti ... 358
6.15. Standardna klasa string ... 361
6.16. Zašto moja klasa ne odlazi u raj? ... 366
    6.16.1. Klasa nije struktura koja samo objedinjuje podatke ... 366
    6.16.2. Jasno razdvojiti sučelje od implementacije ... 366
    6.16.3. Klasa mora imati točno određeno područje odgovornosti ... 367
    6.16.4. Voditi računa o skrivanju podataka ... 367
    6.16.5. Izbjegavati (ne)prijatelje ... 367
    6.16.6. Minimalno sučelje ... 367
    6.16.7. Mjerila kvalitete apstrakcije ... 368

piramidica 7. Strukture i unije 371

7.1. Struktura ili klasa? ... 371
7.2. Unije ... 373
    7.3. Polja bitova ... 376

piramidica 8. Preopterećenje operatora 379

8.1. Korisnički definirane pretvorbe ... 379
    8.1.1. Pretvorba konstruktorom ... 380
    8.1.2. Eksplicitni konstruktori ... 381
    8.1.3. Operatori pretvorbe ... 383
8.2. Osnove preopterećenja operatora ... 388
8.3. Definicija operatorske funkcije ... 390
    8.3.1. Operator = ... 394
    8.3.2. Operator [] ... 396
    8.3.3. Operator () ... 399
    8.3.4. Operator -> ... 401
    8.3.5. Prefiks i postfiks operatori ++ i -- ... 404
    8.3.6. Operatori new i delete ... 408
8.4. Opće napomene o preopterećenju operatora ... 416

piramidica 9. Nasljeđivanje i hijerarhija klasa 419

9.1. Ima li klasa bogatog strica u Ameriki? ... 419
9.2. Specificiranje nasljeđivanja ... 424
9.3. Pristup naslijeđenim članovima ... 430
9.4. Nasljeđivanje i prava pristupa ... 433
    9.4.1. Zaštićeno pravo pristupa ... 433
    9.4.2. Javne osnovne klase ... 434
    9.4.3. Privatne osnovne klase ... 436
    9.4.4. Zaštićene osnovne klase ... 438
    9.4.5. Posebne napomene o pravima pristupa ... 440
    9.4.6. Izuzeće članova ... 442
9.5. Nasljeđivanje i pripadnost ... 443
9.6. Inicijalizacija i uništavanje izvedenih klasa ... 445
9.7. Standardne pretvorbe i nasljeđivanje ... 448
9.8. Područje razreda i nasljeđivanje ... 451
    9.8.1. Razlika nasljeđivanja i preopterećenja ... 452
    9.8.2. Ugniježđene klase i nasljeđivanje ... 453
9.9. Klase kao argumenti funkcija ... 454
    9.9.1. Točno podudaranje tipova ... 455
    9.9.2. Standardne pretvorbe ... 455
    9.9.3. Korisnički definirane pretvorbe ... 457
9.10. Nasljeđivanje preopterećenih operatora ... 459
9.11. Principi polimorfizma ... 462
    9.11.1. Virtualni funkcijski članovi ... 465
    9.11.2. Poziv virtualnih funkcijskih članova ... 469
    9.11.3. Čiste virtualne funkcije ... 472
    9.11.4. Virtualni destruktori ... 473
9.12. Virtualne osnovne klase ... 475
    9.12.1. Deklaracija virtualnih osnovnih klasa ... 477
    9.12.2. Pristup članovima virtualnih osnovnih klasa ... 478
    9.12.3. Inicijalizacija osnovnih virtualnih klasa ... 480
9.13. Kako dobro iskoristiti nasljedstvo ... 482
    9.13.1. Nasljeđivati ili ne nasljeđivati? ... 482
    9.13.2. Nasljeđivanje koristiti na ispravan način ... 492
    9.13.3. Formiranje hijerarhije nasljeđivanja ... 492
    9.13.4. Korištenje poliformizma i virtualni funkcijski članovi ... 493
    9.13.5. Zaštita podatkovnih članova ... 494

piramidica 10. Predlošci funkcija i klasa 495

10.1. Uporabna vrijednost predložaka ... 495
10.2. Predlošci funkcija ... 496
    10.2.1. Definicija predloška funkcije ... 497
    10.2.2. Parametri predloška funkcije ... 499
    10.2.3. Instantacija predloška funkcije ... 502
    10.2.4. Eksplicitna instantacija predloška ... 506
    10.2.5. Preopterećivanje predložaka funkcija ... 508
    10.2.6. Specijalizacije predložaka funkcija ... 509
    10.2.7. Primjer predloška funkcije za bubble sort ... 511
10.3. Predlošci klasa ... 512
    10.3.1. Definicija predloška klase ... 513
    10.3.2. Instantacija predložaka klasa ... 517
    10.3.3. Eksplicitna instantacija predložaka klasa ... 520
    10.3.4. Specijalizacije predložaka klasa ... 521
    10.3.5. Predlošci klasa sa statičkim članovima ... 523
    10.3.6. Konstantni izrazi kao parametri predložaka ... 525
    10.3.7. Predlošci i ugniježđeni tipovi ... 526
    10.3.8. Ugniježđeni predlošci ... 528
    10.3.9. Predlošci i prijatelji klase ... 530
    10.3.10. Predlošci i nasljeđivanje ... 533
    10.3.11. Predlošci klasa i polimorfizam ... 535
10.4. Mjesto instantacije ... 538
10.5. Realizacija klase Lista predloškom ... 541
10.6. Predlošci klasa u standardnoj biblioteci ... 544
    10.6.1. Predložak klase complex ... 544
    10.6.2. Predložak klase valarray ... 548
10.7. Metaprogramiranje predlošcima ... 558
10.8. Zaključak o predlošcima ... 561

piramidica 11. Rukovanje iznimkama 563

11.1. Što su iznimke? ... 563
11.2. Blokovi pokušaja i hvatanja iznimaka ... 566
11.3. Tijek obrade iznimaka ... 569
11.4. Detaljnije o ključnoj riječi catch ... 572
    11.4.1. Prosljeđivanje iznimke ... 574
    11.4.2. Alokacija i oslobađanje memorije ... 575
    11.4.3. Pokazivači i reference kao objekti iznimki ... 577
11.5. Navođenje liste mogućih iznimaka ... 578
11.6. Iznimke kod dinamičke alokacije memorije ... 581
11.7. Iznimke u konstruktoru ... 584
11.8. Standardne iznimke ... 587

piramidica 12. Identifikacija tipa tijekom izvođenja 589

12.1. Statički i dinamički tipovi ... 589
12.2. Operator typeid ... 591
12.3. Sigurna pretvorba ... 594
12.4. Ostali operatori pretvorbe ... 598
    12.4.1. Promjena konstantnosti objekta ... 598
    12.4.2. Statičke dodjele ... 598

piramidica 13. Imenici 603

13.1. Problem područja imena ... 603
13.2. Deklaracija imenika ... 604
13.3. Pristup elementima imenika ... 607
    13.3.1. Deklaracija using ... 608
    13.3.2. Direktiva using ... 613
    13.3.3. Standardni imenik std ... 616
13.4. Imenici i stari programski kôd ... 617

piramidica 14. Organizacija kôda u više datoteka 619

14.1. Zašto u više datoteka? ... 619
14.2. Povezivanje ... 620
    14.2.1. Unutarnje i vanjsko povezivanje ... 622
    14.2.2. Specificiranje unutarnjeg povezivanja ... 625
    14.2.3. Specifikator extern ... 627
14.3. Pravilo jednokratne definicije ... 629
14.4. Datoteke zaglavlja ... 630
14.5. Organizacija predložaka ... 634
14.6. Primjer raspodjele deklaracija i definicija u više datoteka ... 640
14.7. Opće napomene o uključivanjima zaglavlja ... 648
14.8. Povezivanje s kôdom drugih programskih jezika ... 652
    14.8.1. Poziv C funkcija iz C++ kôda ... 653
    14.8.2. Uključivanje asemblerskog kôda ... 655

piramidica 15. Ulazni i izlazni tokovi 657

15.1. Što su tokovi ... 657
15.2. Organizacija biblioteke ... 659
15.3. Stanje toka ... 661
15.4. Ispis pomoću cout ... 662
    15.4.1. Operator umetanja << ... 662
    15.4.2. Ispis korisnički definiranih tipova ... 664
    15.4.3. Ostali članovi razreda ostream ... 666
15.5. Učitavanje pomoću cin ... 666
    15.5.1. Učitavanje pomoću operatora >> ... 667
    15.5.2. Učitavanje korisnički definiranih tipova ... 668
    15.5.3. Učitavanje znakovnih nizova ... 669
    15.5.4. Ostali članovi razreda istream ... 672
15.6. Kontrola učitavanja i ispisa ... 675
    15.6.1. Vezivanje tokova ... 676
    15.6.2. Širina ispisa ... 676
    15.6.3. Popunjavanje praznina ... 677
    15.6.4. Zastavice za formatiranje ... 677
    15.6.5. Formatirani prikaz realnih brojeva ... 681
    15.6.6. Manipulatori ... 683
15.7. Datotečni ispis i učitavanje ... 687
    15.7.1. Klase ifstream i ofstream ... 687
    15.7.2. Otvaranje i zatvaranje datoteke ... 690
    15.7.3. Klasa fstream ... 692
    15.7.4. Određivanje i postavljanje položaja unutar datoteke ... 694
    15.7.5. Binarni zapis i učitavanje ... 696
15.8. Tokovi vezani na znakovne nizove ... 699
15.9. Ulijeva li se svaki tok u more? ... 700

piramidica 16. Standardna biblioteka predložaka 701

16.1. Organizacija standardne biblioteke ... 701
    16.1.1. Podrška jeziku ... 702
    16.1.2. Dijagnostika ... 703
    16.1.3. Općenite pomoćne komponente ... 703
    16.1.4. Znakovni nizovi ... 704
    16.1.5. Zemljopisno lokalni servisi ... 704
    16.1.6. Numeričke komponente ... 705
    16.1.7. Ulazno-izlazne komponente ... 705
    16.1.8. Spremnici, iteratori i algoritmi ... 705
16.2. Standardna biblioteka predložaka od stoljeća Sedmog ... 706
16.3. Struktura biblioteke ... 707
16.4. Spremnici ... 708
    16.4.1. Vektor ... 709
    16.4.2. Lista ... 716
    16.4.3. Dvostrani red ... 717
16.5. Iteratori ... 717
    16.5.1. Koji je smisao iteratora ... 717
    16.5.2. Opća svojstva iteratora ... 721
    16.5.3. Ulazni i izlazni iteratori ... 728
    16.5.4. Iteratori prema naprijed ... 729
    16.5.5. Dvosmjerni iteratori ... 730
    16.5.6. Iteratori za slučajni pristup ... 731
16.6. Algoritmi ... 732
    16.6.1. Kako napisati generički algoritam ... 733
    16.6.2. Podjela algoritama u Standardnoj biblioteci ... 735
    16.6.3. Operacije koje ne mijenjaju redoslijed elemenata niza ... 735
    16.6.4. Operacije koje mijenjaju redoslijed elemenata ... 737
    16.6.5. Operacije razvrstavanja ... 739
    16.6.6. Algoritmi naslijeđeni iz jezika C ... 741
16.7. Funkcijski objekti ... 741
    16.7.1. Što su funkcijski objekti ... 741
    16.7.2. Predikati ... 743
    16.7.3. Aritmetički funkcijski objekti ... 745
    16.7.4. Veznici, adapteri i negatori ... 746
16.8. Lambda izrazi ... 749
16.9. Asocijativni spremnici ... 753
    16.9.1. Skup i višekratni skup ... 754
    16.9.2. Mapa i višekratna mapa ... 761
16.10. Posebni spremnici ... 764
    16.10.1. Stog ... 764
    16.10.2. Red ... 765
    16.10.3. Prioritetni red ... 766
    16.10.4. Skup bitova ... 767
16.11. Opće napomene o korištenju STL-a ... 770

piramidica 17. Pretprocesorske naredbe 773

17.1. U početku bijaše pretprocesor ... 773
17.2. Naredba #include ... 774
17.3. Naredba #define ... 775
    17.3.1. Trajanje definicije ... 776
    17.3.2. Rezervirana makro imena ... 777
    17.3.3. Makro funkcije ... 779
    17.3.4. Operatori za rukovanje nizovima ... 779
17.4. Uvjetno prevođenje ... 780
    17.4.1. Primjena uvjetnog prevođenja za pronalaženje pogrešaka ... 782
17.5. Ostale pretprocesorske naredbe ... 783
17.6. Ma ča će meni pretprocesor? ... 784

piramidica 18. Principi objektno orijentiranog dizajna 785

18.1. Zašto uopće C++? ... 785
18.2. Objektna paradigma ... 786
18.3. Ponovna iskoristivost ... 788
18.4. Korak 1: Pronalaženje odgovarajuće apstrakcije ... 789
18.5. Korak 2: Definicija apstrakcije ... 791
    18.5.1. Definicija ekrana ... 791
    18.5.2. Definicija prozora ... 792
    18.5.3. Definicija izbornika ... 792
18.6. Korak 3: Definicija odnosa i veza između klasa ... 793
    18.6.1. Odnosi objekata u korisničkom sučelju ... 796
18.7. Korak 4: Definicija implementacijski zavisnih apstrakcija ... 800
18.8. Korak 5: Definicija sučelja ... 801
18.9. Korak 6: Implementacija ... 809

Prilog
piramidica A. Standardna biblioteka 813

A.1. Standardne makro funkcije i makro imena ... 815
A.2. Standardne vrijednosti ... 822
A.3. Standardni tipovi ... 822
A.4. Standardne klase i strukture ... 822

piramidica B. Standardne funkcije 825

B.1. Funkcije vezane uz znakove i znakovne nizove ... 826
B.2. Funkcije za međusobne pretvorbe nizova i brojeva ... 832
B.3. Funkcije vezane uz vrijeme i datum ... 834
B.4. Matematičke funkcije ... 837
B.5. Ulazno-izlazne funkcije za standardne tokove ... 845
B.6. Funkcije za rad s datotekama ... 848
B.7. Ostale funkcije ... 854

piramidica C. Standardna biblioteka predložaka 863

C.1. Generički algoritmi ... 863

piramidica D. Korištenje prevoditelja 877

D.1. Dev-C++ ... 877
D.2. Microsoft Visual C++ ... 880
D.3. Ispis naših znakova u konzoli ... 883

Rječnik češće korištenih pojmova 887
piramidica Literatura 897

Programski jezik C++ ... 897
Dizajn ... 900

Abecedno kazalo 901