|
|
|
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
7. Strukture i unije
|
371
|
|
|
7.1. Struktura ili klasa? ... 371
7.2. Unije ... 373
7.3. Polja bitova ... 376
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
|
|
|
|
|
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
|
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
|
C. Standardna biblioteka predložaka
|
863
|
|
|
C.1. Generički algoritmi ... 863
|
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
|
|
|
|
|
Literatura
|
897
|
|
|
Programski jezik C++ ... 897
Dizajn ... 900
|
|
|
Abecedno kazalo
|
901
|