-
Notifications
You must be signed in to change notification settings - Fork 9
/
cpp3rd_content.txt
890 lines (889 loc) · 57.5 KB
/
cpp3rd_content.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
Оглавление================================================================7
Предисловие автора к третьему русскому изданию ..........................25
======ВВЕДЕНИЕ ==== = = = = = = = = = = = = = = = = = = = = = = = = = = 35
Глава 1. Обращение к читателю............................................37
Глава 2. Обзор С++.......................................................57
Глава 3. Обзор стандартной библиотеки....................................81
=====Часть I. Основные средства ====== = = = = = = = = = = = = = = = = ==105
Глава 4. Типы и объявления...............................................107
Глава 5. Указатели, массивы и структуры..................................127
Глава 6. Выражения и инструкции..........................................147
Глава 7. Функции.........................................................185
Глава 8. Пространства имен и исключения..................................209
Глава 9. Исходные файлы и программы......................................241
======Часть II. Механизмы абстракции ===== = = = = = = = = = = = = = = = 267
Глава 10. Классы.........................................................269
Глава 11. Перегрузка операторов..........................................309
Глава 12. Производные классы.............................................349
Глава 13. Шаблоны........................................................377
Глава 14. Обработка исключений...........................................407
Глава 15. Иерархии классов...............................................443
======Часть III. Стандартная библиотека ===== = = = = = = = = = = = = = =483
Глава 16. Организация библиотеки и контейнеры............................485
Глава 17. Стандартные контейнеры.........................................519
Глана 18. Алгоритмы и объекты-функции....................................569
Глава 19. Итераторы и распределители памяти .............................613
Глава 20. Строки.........................................................645
Глава 21. Потоки.........................................................671
Глава 22. Численные методы...............................................725
======Часть IV. Проектирование с использованием С++ ====== = = = = = = = 757
Глава 23. Разработка и проектирование....................................759
Глава 24. Проектирование и программирование..............................797
Глава 25. Роли классов...................................................841
======Приложения и предметный указатель ====== = = = = = = = = = = = = = 869
Приложение А. Грамматика.................................................871
Приложение Б. Совместимость..............................................891
Приложение В. Технические подробности....................................903
Приложение Г. Локализация................................................947
Приложение Д. Безопасность исключений и стандартная библиотека..........1017
Предметный указатель....................................................1055
Оглавление================================================================7
Предисловие автора к третьему русскому изданию ..........................25
От редакции русского издания ....................................27
Предисловие .....................................................29
Предисловие ко второму изданию ..................................31
Предисловие к первому изданию....................................33
======ВВЕДЕНИЕ ==== = = = = = = = = = = = = = = = = = = = = = = = = = = =35
Глава 1. Обращение к читателю............................................37
1.1. Структура этой книги........................................37
1.1.1. Примеры и ссылки..................................39
1.1.2. Упражнения........................................40
1.1.3. Замечания по реализации...........................40
1.2. Изучение С++................................................41
1.3. Структура С++...............................................42
1.3.1. Эффективность и структура.........................43
1.3.2. Философские замечания.............................44
1.4. Исторические замечания......................................45
1.5. Использование С++...........................................47
1.6. С и С++.....................................................49
1.6.1. Рекомендации для программистов на С...............50
1.6.2. Рекомендации для программистов на С++.............50
1.7. Размышления о программировании на С++.......................51
1.8. Советы......................................................52
1.8.1. Литература........................................53
Глава 2. Обзор С++.......................................................57
2.1. Что такое С++?..............................................57
2.2. Парадигмы программирования..................................57
2.3. Процедурное программирование................................59
2.3.1. Переменные и арифметические операции..............59
2.3.2. Условия и циклы...................................60
2.3.3. Указатели и массивы...............................62
2.4. Модульное программирование..................................62
2.4.1. Раздельная компиляция.............................64
2.4.2. Обработка исключений..............................65
2.5. Абстракция данных...........................................66
2.5.1. Модули, определяющие типы.........................66
2.5.2. Типы, определяемые пользователем..................68
2.5.3. Конкретные типы...................................69
2.5.4. Абстрактные типы..................................71
2.5.5. Виртуальные функции...............................73
2.6. Объектно-ориентированное программирование...................73
2.6.1. Проблемы, связанные с конкретными типами..........74
2.6.2. Иерархия классов..................................75
2.7. Обобщенное программирование.................................76
2.7.1. Контейнеры........................................77
2.7.2. Обобщенные алгоритмы..............................78
2.8. Заключение..................................................79
2.9. Советы......................................................80
Глава 3. Обзор стандартной библиотеки....................................81
3.1. Введение....................................................81
3.2. Здравствуй, мир!............................................82
3.3. Пространство имен стандартной библиотеки....................82
3.4. Вывод.......................................................83
3.5. Строки......................................................84
3.5.1. С-строки..........................................85
3.6. Ввод........................................................86
3.7. Контейнеры..................................................88
3.7.1. Вектор............................................88
3.7.2. Проверка допустимости диапазона...................89
3.7.3. Список............................................90
3.7.4. Ассоциативные массивы.............................91
3.7.5. Стандартные контейнеры............................92
3.8. Алгоритмы...................................................93
3.8.1. Использование итераторов..........................94
3.8.2. Типы итераторов...................................95
3.8.3. Итераторы и ввод/вывод............................96
3.8.4. Проход с выполнением и предикаты..................98
3.8.5. Алгоритмы, использующие функции-члены.............99
3.8.6. Алгоритмы стандартной библиотеки..................100
3.9. Математические вычисления...................................101
3.9.1. Комплексные числа.................................101
3.9.2. Векторная арифметика..............................101
3.9.3. Поддержка базовых численных операций..............102
3.10. Средства стандартной библиотеки............................102
3.11. Советы.....................................................103
=====Часть I. Основные средства ====== = = = = = = = = = = = = = = = = = 105
Глава 4. Типы и объявления...............................................107
4.1. Типы........................................................107
4.1.1. Фундаментальные типы..............................108
4.2. Логическиетипы..............................................109
4.3. Символьные типы.............................................109
4.3.1. Символьные литералы...............................111
4.4. Целые типы..................................................111
4.4.1. Целые литералы....................................111
4.5. Типы с плавающей точкой.....................................112
4.5.1. Литералы с плавающей точкой.......................112
4.6. Размеры.....................................................113
4.7. Тип void....................................................114
4.8. Перечисления................................................115
4.9. Объявления..................................................116
4.9.1. Структура объявления..............................118
4.9.2. Объявление нескольких имен........................119
4.9.3. Имена.............................................119
4.9.4. Область видимости.................................120
4.9.5. Инициализация.....................................122
4.9.6. Объекты и lvalue..................................123
4.9.7. typedef...........................................123
4.10. Советы.....................................................124
4.11. Упражнения.................................................125
Глава 5. Указатели, массивы и структуры..................................127
5.1. Указатели...................................................127
5.1.1. Ноль..............................................128
5.2. Массивы.....................................................128
5.2.1. Инициализаторы массивов...........................129
5.2.2. Строковые литералы................................130
5.3. Указатели на массивы........................................131
5.3.1. Доступ к элементам массива........................132
5.4. Константы...................................................134
5.4.1. Указатели и константы.............................136
5.5. Ссылки......................................................137
5.6. Указатель на void...........................................140
5.7. Структуры...................................................141
5.7.1. Эквивалентность типов.............................144
5.8. Советы......................................................144
5.9. Упражнения..................................................145
Глава 6. Выражения и инструкции..........................................147
6.1. Калькулятор.................................................147
6.1.1. Синтаксический анализатор.........................148
6.1.2. Функция ввода.....................................152
6.1.3. Низкоуровневый ввод...............................155
6.1.4. Обработка ошибок..................................156
6.1.5. Драйвер...........................................156
6.1.6. Заголовочные файлы................................157
6.1.7. Параметры командной строки........................158
6.1.8. Замечание о стиле.................................160
6.2. Обзор операторов............................................160
6.2.1. Результаты........................................162
6.2.2. Последовательность вычислений.....................163
6.2.3. Приоритет операторов..............................164
6.2.4. Побитовые логические операторы....................165
6.2.5. Инкремент и декремент.............................166
6.2.6. Свободная память..................................168
6.2.6.1. Массивы.................................169
6.2.6.2. Отсутствие памяти.......................170
6.2.7. Явное преобразование типов........................171
6.2.8. Конструкторы......................................173
6.3. Инструкции..................................................174
6.3.1. Объявления в качестве инструкций..................175
6.3.2. Инструкции выбора.................................175
6.3.2.1. Объявления в условиях...................177
6.3.3. Инструкции циклов.................................178
6.3.3.1. Объявления в for-инструкции.............179
6.3.4. goto..............................................179
6.4. Комментарии и отступы.......................................180
6.5. Советы......................................................181
6.6. Упражнения..................................................182
Глава 7. Функции.........................................................185
7.1. Объявления функции..........................................185
7.1.1. Определения функций...............................186
7.1.2. Статические переменные............................186
7.2. Передача аргументов.........................................187
7.2.1. Массивы в качестве аргументов.....................189
7.3. Возвращаемое значение.......................................190
7.4. Перегруженные имена функций.................................191
7.4.1. Перегрузка и возвращаемые типы....................193
7.4.2. Перегрузка и область видимости....................194
7.4.3. Явное разрешение неоднозначности..................194
7.4.4. Разрешение в случае нескольких аргументов.........195
7.5. Аргументы по умолчанию......................................196
7.6. Неуказанное количество аргументов...........................197
7.7. Указатель на функцию........................................199
7.8. Макросы.....................................................203
7.8.1. Условная компиляция...............................205
7.9. Советы......................................................205
7.10. Упражнения.................................................206
Глава 8. Пространства имен и исключения..................................209
8.1. Разбиение на модули и интерфейсы............................209
8.2. Пространства имен...........................................211
8.2.1. Имена с квалификаторами...........................213
8.2.2. Объявления using..................................213
8.2.3. Директивы using...................................215
8.2.4. Множественные интерфейсы..........................216
8.2.4.1. Альтернативы при проектировании интерфса218
8.2.5. Разрешение конфликтов имен........................220
8.2.5.1. Неименованные пространства имен.........220
8.2.6. Поиск имен........................................221
8.2.7. Псевдонимы пространств имен.......................222
8.2.8. Объединение пространств имен......................223
8.2.8.1. Отбор...................................224
8.2.8.2. Объединение и отбор.....................225
8.2.9. Пространства имен и старый код....................226
8.2.9.1. Пространства имен и С...................22b
8.2.9.2. Пространства имен и перегрузка..........227
8.2.9.3. Пространства имен открыты...............228
8.3. Исключения..................................................230
8.3.1. throw и catch.....................................231
8.3.2. Выбор исключений..................................232
8.3.3. Исключения в программе калькулятора...............234
8.3.3.1. Альтернативные стратегии обработки ошибо237к
8.4. Советы......................................................238
8.5. Упражнения..................................................239
Глава 9. Исходные файлы и программы......................................241
9.1. Раздельная компиляция.......................................241
9.2. Компоновка..................................................242
9.2.1. Заголовочные файлы................................245
9.2.2. Заголовочные файлы стандартной библиотеки.........247
9.2.3. Правило одного определения........................247
9.2.4. Компоновка кода, написанного не на С++............250
9.2.5. Компоновка и указатели на функции.................252
9.3. Использование заголовочных файлов...........................253
9.3.1. Единственный заголовочный файл....................253
9.3.2. Несколько заголовочных файлов.....................256
9.3.2.1. Остальные модули калькулятора...........258
9.3.2.2. Использование заголовочных файлов.......260
9.3.3. Стражи включения..................................261
9.4. Программы...................................................262
9.4.1. Инициализация нелокальных переменных..............262
9.4.1.1. Завершение выполнения программы.........263
9.5. Советы......................................................264
9.6. Упражнения..................................................265
======Часть II. Механизмы абстракции ===== = = = = = = = = = = = = = = = 267
Глава 10. Классы.........................................................269
10.1. Введение...................................................269
10.2. Классы.....................................................270
10.2.1. Функции-члены....................................270
10.2.2. Управление доступом..............................271
10.2.3. Конструкторы.....................................272
10.2.4. Статические члены................................274
10.2.5. Копирование объектов класса......................275
10.2.6. Константные функции-члены........................276
10.2.7. Ссылка на себя...................................277
10.2.7.1. Физическое и логическое постоянство....278
10.2.7.2. Объявление mutable.....................279
10.2.8. Структуры и классы...............................280
10.2.9. Определение функции в классе.....................281
10.3. Эффективные типы, определяемые пользователем...............282
10.3.1. Функции-члены....................................285
10.3.2. Функции-помощники................................287
10.3.3. Перегрузка операторов............................287
10.3.4. Роль конкретных классов..........................288
10.4. Объекты....................................................289
10.4.1. Деструкторы......................................289
10.4.2. Конструкторы по умолчанию........................290
10.4.3. Конструирование и уничтожение....................291
10.4.4. Локальные переменные.............................292
10.4.4.1. Копирование объектов...................292
10.4.5. Свободная память.................................293
10.4.6. Объекты в качестве членов........................294
10.4.6.1. Необходимая инициализация членов.......295
10.4.6.2. Члены-константы........................296
10.4.6.3. Копирование членов.....................296
10.4.7. Массивы..........................................297
10.4.8. Локальная статическая память.....................299
10.4.9. Нелокальная память...............................299
10.4.10. Временные объекты...............................301
10.4.11. Размещение объектов.............................303
10.4.12. Объединения.....................................304
10.5. Советы.....................................................305
10.6. Упражнения.................................................306
Глава 11. Перегрузка операторов..........................................309
11.1. Введение...................................................309
11.2. Операторные функции........................................310
11.2.1. Бинарные и унарные операторы.....................311
11.2.2. Предопределенный смысл операторов................312
11.2.3. Операторы и типы, определяемые пользователем.....313
11.2.4. Операторы в пространствах имен...................314
11.3. Тип комплексных чисел......................................315
11.3.1. Операторы-члены и не-члены.......................316
11.3.2. Смешанная арифметика.............................317
11.3.3. Инициализация....................................318
11.3.4. Копирование......................................319
11.3.5. Конструкторы и преобразования....................320
11.3.6. Литералы.........................................321
11.3.7. Дополнительные функции-члены.....................321
11.3.8. Функции-помощники................................322
11.4. Операторы преобразования...................................323
11.4.1. Разрешение неоднозначности.......................325
11.5. Друзья класса..............................................326
11.5.1. Поиск друзей.....................................328
11.5.2. Друзья и члены...................................329
11.6. Большие объекты............................................330
11.7. Важные операторы...........................................332
11.7.1. Явные конструкторы...............................333
11.8. Индексация.................................................334
11.9. Вызов функции..............................................335
11.10. Разыменование.............................................337
11.11. Инкремент и декремент.....................................339
11.12. Класс String..............................................341
11.13. Советы....................................................346
11.14. Упражнения................................................346
Глава 12. Производные классы.............................................349
12.1. Введение...................................................349
12.2. Производные классы.........................................350
12.2.1. Функции-члены....................................352
12.2.2. Конструкторы и деструкторы.......................354
12.2.3. Копирование......................................355
12.2.4. Иерархия классов.................................355
12.2.5. Поля типа........................................356
12.2.6. Виртуальные функции..............................358
12.3. Абстрактные классы.........................................361
12.4. Проектирование иерархий классов............................363
12.4.1. Традиционная иерархия классов....................363
12.4.1.1. Критика................................366
12.4.2. Абстрактные классы...............................367
12.4.3. Альтернативные реализации........................369
12.4.3.1. Критика................................371
12.4.4. Локализация создания объектов....................371
12.5. Иерархии классов и абстрактные классы......................372
12.6. Советы.....................................................373
12.7. Упражнения.................................................373
Глава 13. Шаблоны........................................................377
13.1. Введение...................................................377
13.2. Простой шаблон строк.......................................378
13.2.1. Определение шаблона..............................380
13.2.2. Инстанцирование..................................381
13.2.3. Параметры шаблонов...............................382
13.2.4. Эквивалентность типов............................382
13.2.5. Проверка типов...................................383
13.3. Шаблоны функций............................................384
13.3.1. Аргументы шаблонов функций.......................385
13.3.2. Перегрузка шаблонов функций......................386
13.4. Использование аргументов шаблона для выбора алгоритма......389
13.4.1. Параметры шаблонов по умолчанию..................390
13.5. Специализация..............................................392
13.5.1. Порядок специализаций............................394
13.5.2. Специализация шаблонов функций...................395
13.6. Наследование и шаблоны.....................................396
13.6.1. Параметризация и наследование....................398
13.6.2. Члены-шаблоны....................................399
13.6.3. Отношения наследования...........................400
13.6.3.1. Преобразования шаблонов........................401
13.7. Организация исходного кода.................................402
13.8. Советы.....................................................403
13.9. Упражнения.................................................404
Глава 14. Обработка исключений...........................................407
14.1. Обработка ошибок...........................................407
14.1.1. Альтернативный взгляд на исключения..............410
14.2. Группировка исключений.....................................410
14.2.1. Производные исключения...........................412
14.2.2. Композиция исключений............................413
14.3. Перехват исключений........................................414
14.3.1. Повторная генерация..............................415
14.3.2. Перехват всех исключений.........................415
14.3.2.1. Порядок записи обработчиков............416
14.4. Управление ресурсами.......................................417
14.4.1. Использование конструкторов и деструкторов.......419
14.4.2. auto_ptr.........................................420
14.4.3. Предостережение..................................422
14.4.4. Исключения и оператор new........................422
14.4.5. Исчерпание ресурсов..............................423
14.4.6. Исключения в конструкторах.......................425
14.4.6.1. Исключения и инициализация членов......426
14.4.6.2. Исключения и копирование...............426
14.4.7. Исключения в деструкторах........................427
14.5. Исключения, не являющиеся ошибками.........................427
14.6. Спецификации исключений....................................429
14.6.1. Проверка спецификаций исключений.................430
14.6.2. Неожидаемые исключения...........................431
14.6.3. Отображение исключений...........................431
14.6.3.1. Отображение исключений пользователем...432
14.6.3.2. Восстановление типа исключения.........433
14.7. Неперехваченные исключения.................................434
14.8. Исключения и эффективность.................................425
14.9. Альтернативные методы обработки ошибок.....................437
14.10. Стандартные исключения....................................439
14.11. Советы....................................................441
14.12. Упражнения................................................441
Глава 15. Иерархии классов...............................................443
15.1. Введение и обзор...........................................443
15.2. Множественное наследование.................................444
15.2.1. Разрешение неоднозначности.......................445
15.2.2. Наследование и using-объявления..................446
15.2.3. Повторяющиеся базовые классы.....................448
15.2.3.1. Замещение............:.................449
15.2.4. Виртуальные базовые классы.......................450
15.2.4.1. Программирование виртуальных базовых кл451ассов
15.2.5. Использование множественного наследования........453
15.2.5.1. Замещение функции виртуальных базовых.к455лассов
15.3. Управление доступом........................................456
15.3.1. Защищенные члены.................................458
15.3.1.1. Использование защищенных членов........459
15.3.2. Доступ к базовым классам.........................460
15.3.2.1. Множественное наследование и управление461доступом
15.3.2.2. using-объявления и управление доступом.461
15.4. Информация о типе на этапе выполнения......................462
15.4.1. Динамическое приведение dynamic_cast.............463
15.4.1.1. Динамическое приведение ссылок.........465
15.4.2. Навигация по иерархии классов....................466
15.4.2.1. Статическое и динамическое приведение..468
15.4.3. Конструирование и уничтожение объектов класса....469
15.4.4. Typeid и дополнительная информация о типе........469
15.4.4.1. Дополнительная информация о типе.......471
15.4.5. Разумное и неразумное использование RTTI.........472
15.5. Указатели на члены.........................................474
15.5.1. Базовые и производные классы.....................476
15.6. Свободная память...........................................477
15.6.1. Выделение памяти под массив......................479
15.6.2. «Виртуальные конструкторы».......................479
15.7. Советы.....................................................481
15.8. Упражнения.................................................481
======Часть III. Стандартная библиотека ===== = = = = = = = = = = = = = =483
Глава 16. Организация библиотеки и контейнеры............................485
16.1. Проектирование стандартной библиотеки......................485
16.1.1. Проектные ограничения............................486
16.1.2. Организация стандартной библиотеки...............487
16.1.3. Поддержка языка..................................491
16.2. Проектирование контейнеров.................................491
16.2.1. Специализированные контейнеры и итераторы........491
16.2.2. Контейнеры с общим базовым классом...............494
16.2.3. STL-контейнеры...................................497
16.3. Вектора....................................................499
16.3.1. Типы.............................................499
16.3.2. Итераторы........................................501
16.3.3. Доступ к элементам...............................502
16.3.4. Конструкторы.....................................504
16.3.5. Операции со стеком...............................507
16.3.6. Операции, характерные для списков................509
16.3.7. Адресация элементов..............................511
16.3.8. Размеры и емкость................................512
16.3.9. Другие функции-члены.............................514
16.3.10. Функции-помощники...............................515
16.3.11. vector<bool>....................................515
16.4. Советы.....................................................516
16.5. Упражнения.................................................517
Глава 17. Стандартные контейнеры.........................................519
17.1. Стандартные контейнеры.....................................519
17.1.1. Обзор операций...................................520
17.1.2. Краткий обзор контейнеров........................522
17.1.3. Представление....................................524
17.1.4. Требования к элементам...........................524
17.1.4.1. Сравнения..............................525
17.1.4.2. Другие операторы отношения.............527
17.2. Последовательности.........................................528
17.2.1. Вектора..........................................528
17.2.2. Списки...........................................528
17.2.2.1. Удаление-вставка, сортировка и слияние.529
17.2.2.2. Операции с начальными элементами.......531
17.2.2.3. Другие операции........................531
17.2.3. Очереди с двумя концами..........................533
17.3. Адаптеры последовательностей...............................533
17.3.1. Стек.............................................533
17.3.2. Очереди..........................................535
17.3.3. Очереди с приоритетом............................536
17.4. Ассоциативные контейнеры...................................538
17.4.1. Ассоциативные массивы............................539
17.4.1.1. Типы...................................539
17.4.1.2. Итераторы и пары.......................540
17.4.1.3. Индексация.............................541
17.4.1.4. Конструкторы...........................543
17.4.1.5. Сравнения..............................543
17.4.1.6. Операции с ассоциативными массивами....544
17.4.1.7. Операции со списками...................546
17.4.1.8. Другие функции.........................548
17.4.2. Контейнер multimap...............................549
17.4.3. Множества........................................550
17.4.4. Контейнер multiset...............................550
17.5. Почти контейнеры...........................................550
17.5.1. Строки...........................................551
17.5.2. Valarray.........................................551
17.5.3. Битовые наборы...................................551
17.5.3.1. Конструкторы...........................552
17.5.3.2. Операции с битами......................553
17.5.3.3. Другие операции........................554
17.5.4. Встроенные массивы...............................555
17.6. Определение нового контейнера..............................556
17.6.1. hash_map.........................................556
17.6.2. Представление и конструирование..................558
17.6.2.1. Поиск..................................560
17.6.2.2. Удаление и повторное хэширование.......561
17.6.2.3. Хэширование............................562
17.6.3. Другие хэшированные ассоциативные контейнеры.....563
17.7. Советы.....................................................564
17.8. Упражнения.................................................564
Глана 18. Алгоритмы и объекты-функции....................................569
18.1. Введение...................................................569
18.2. Обзор алгоритмов стандартной библиотеки....................569
18.3. Последовательности и контейнеры............................574
18.3.1. Входные последовательности.......................575
18.4. Объекты-функции............................................576
18.4.1. Базовые классы для объектов-функций..............578
18.4.2. Предикаты........................................578
18.4.2.1. Обзор предикатов.......................579
18.4.3. Арифметические объекты-функции...................580
18.4.4. Связыватели, адаптеры и отрицатели...............581
18.4.4.1. Связыватели............................582
18.4.4.2. Адаптеры функций-членов................583
18.4.4.3. Указатели на адаптеры функций..........585
18.4.4.4. Отрицатели.............................58S
18.5. Алгоритмы, не модифицирующие последовательность............587
18.5.1. Алгоритмы for_cach...............................587
18.5.2. Семейство find...................................588
18.5.3. Алгоритмы count..................................589
18.5.4. Равенство и несовпадение.........................590
18.5.5. Поиск............................................591
18.6. Алгоритмы, модифицирующие последовательность...............592
18.6.1. Копирование......................................592
18.6.2. Алгоритмы transform..............................594
18.6.3. Алгоритмы unique.................................596
18.6.3.1. Критерии сортировки....................598
18.6.4. Алгоритмы replace................................598
18.6.5. Алгоритмы remove.................................599
18.6.6. Алгоритмы fill и generate........................600
18.6.7. Алгоритмы reverse и rotate.......................601
18.6.8. Алгоритмы swap...................................602
18.7. Сортированные последовательности...........................602
18.7.1. Сортировка (алгоритмы sort)......................602
18.7.2. Двоичный поиск...................................604
18.7.3. Слияние (алгоритмы merge)........................605
18.7.4. Разделители (алгоритмы partition)................605
18.7.5. Операции с множествами для последовательностей...606
18.8. Кучи.......................................................607
18.9. Алгоритмы nin и mаx........................................608
18.10. Перестановки (алгоритмы permutations).....................609
18.11. Алгоритмы в стиле С.......................................610
18.12. Советы....................................................610
18.13. Упражнения................................................611
Глава 19. Итераторы и распределители памяти .............................613
19.1. Введение...................................................613
19.2. Итераторы и последовательности.............................614
19.2.1. Операции с итераторами...........................614
19.2.2. Свойства итераторов..............................616
19.2.3. Категории итераторов.............................617
19.2.4. Вставки (inserters)..............................620
19.2.5. Обратные итераторы...............................621
19.2.6. Итераторы потоков................................622
19.2.6.1.Буфера потоков..........................624
19.3. Итераторы с проверкой (checked_iter).......................626
19.3.1. Исключения, контейнеры и алгоритмы...............631
19.4. Распределители памяти......................................631
19.4.1. Стандартный распределитель памяти................632
19.4.2. Распределители памяти, определяемые пользователем635
19.4.3. Обобщенные распределители памяти.................638
19.4.4. Неинициализированная память......................639
19.4.5. Динамическое распределение памяти................641
19.4.6. Выделение памяти в стиле С.......................642
19.5. Советы.....................................................643
19.6. Упражнения.................................................644
Глава 20. Строки.........................................................645
20.1. Введение............:......................................645
20.2. Символы....................................................645
20.2.1. Особенности символов.............................646
20.3. Тип basic_string...........................................648
20.3.1. Типы.............................................649
20.3.2. Итераторы........................................650
20.3.3. Доступ к элементам...............................651
20.3.4. Конструкторы.....................................651
20.3.5. Ошибки...........................................653
20.3.6. Присваивание.....................................654
20.3.7. Преобразование в С-строку........................655
20.3.8. Сравнения........................................656
20.3.9. Вставка..........................................658
20.3.10. Конкатенация....................................659
20.3.11. Поиск...........................................660
20.3.12. Замена..........................................661
20.3.13. Подстроки.......................................662
20.3.14. Размер и емкость................................664
20.3.15. Операции ввода/вывода...........................664
20.3.16. Перемена местами................................665
20.4. Стандартная библиотека С...................................665
20.4.1. С-строки.........................................665
20.4.2. Классификация символов...........................667
20.5. Советы.....................................................668
20.6. Упражнения.................................................669
Глава 21. Потоки.........................................................671
21.1. Введение...................................................671
21.2. Вывод......................................................673
21.2.1. Потоки вывода....................................674
21.2.2. Вывод встроенных типов...........................676
21.2.3. Вывод типов, определяемых пользователем..........678
21.2.3.1. Виртуальные функции вывода.............679
21.3. Ввод.......................................................680
21.3.1. Потоки ввода.....................................680
21.3.2. Ввод встроенных типов............................680
21.3.3. Состояние потока.................................683
21.3.4. Ввод символов....................................684
21.3.5. Ввод типов, определяемых пользователем...........687
21.3.6. Исключения.......................................688
21.3.7. Связывание потоков...............................690
21.3.8. Часовые..........................................691
21.4. Форматирование.............................................692
21.4.1. Состояние формата................................692
21.4.1.1. Копирование состояния формата..........694
21.4.2. Вывод целых чисел................................694
21.4.3. Вывод чисел с плавающей точкой...................695
21.4.4. Поля вывода......................................696
21.4.5. Выравнивание поля................................6У7
21.4.6. Манипуляторы.....................................698
21.4.6.1. Манипуляторы с аргументами.............699
21.4.6.2. Стандартные манипуляторы ввода/вывода..700
21.4.6.3. Манипуляторы, определяемые пользвателем701
21.5. Файловые и строковые потоки................................703
21.5.1. Файловые потоки..................................704
21.5.2. Закрытие потоков.................................706
21.5.3. Строковые потоки................................."07
21.6. Буферизация................................................708
21.6.1. Потоки вывода и буфера...........................709
21.6.2. Потоки ввода и буфера............................710
21.6.3. Потоки и буфера..................................711
21.6.4. Буфера потоков...................................712
21.7. Национальные особенности...................................716
21.7.1. Функции обратного вызова для потоков.............718
21.8. Ввод-вывод на С............................................718
21.9. Советы.....................................................721
21.10. Упражнения................................................722
Глава 22. Численные методы...............................................725
22.1. Введение...................................................725
22.2. Предельные значения........................................726
22.2.1. Макросы для предельных значений..................728
22.3. Стандартные математические функции.........................728
22.4. Векторная арифметика.......................................729
22.4.1. Конструирование valarray.........................730
22.4.2: Индексация и присваивание для valarray...........731
22.4.3. Операции-члены...................................732
22.4.4. Операции.........................................735
22.4.5. Срезы............................................736
22.4.6. Массив slice array...............................739
22.4.7. Временные массивы, копирование и циклы...........743
22.4.8. Обобщенные срезы.................................745
22.4.9. Маски............................................746
22.4.10. Косвенные массивы...............................747
22.5. Комплексная арифметика.....................................747
22.6. Обобщенные числовые алгоритмы..............................749
22.6.1. Накопление.......................................750
22.6.2. Алгоритм inner_product...........................751
22.6.3. Инкрементное изменение...........................752
22.7. Случайные числа............................................753
22.8. Советы.....................................................755
22.9. Упражнения.................................................755
======Часть IV. Проектирование с использованием С++ ====== = = = = = = = 757
Глава 23. Разработка и проектирование....................................759
23.1. Обзор......................................................759
23.2. Введение...................................................760
23.3. Цели и средства............................................762
23.4. Процесс разработки.........................................765
23.4.1. Цикл разработки..................................767
23.4.2. Цели проектирования..............................769
23.4.3. Этапы проектирования.............................771
23.4.3.1. Этап I: выявление классов..............772
23.4.3.2. Этап 2: определение операций...........775
23.4.3.3. Этап 3: определение взаимозависимостей.777
23.4.3.4. Этап 4: определение интерфейсов........777
23.4.3.5. Реорганизация иерархии классов.........778
23.4.3.6. Использование моделей..................779
23.4.4. Экспериментирование и анализ.....................780
23.4.5. Тестирование.....................................783
23.4.6. Сопровождение программ...........................784
23.4.7. Эффективность....................................784
23.5. Менеджмент.................................................785
23.5.1. Повторное использование..........................785
23.5.2. Масштаб..........................................787
23.5.3. Личности.........................................788
23.5.4. Гибридное проектирование.........................790
23.6. Аннотированная библиография................................792
23.7. Советы.....................................................794
Глава 24. Проектирование и программирование..............................797
24.1. Обзор......................................................797
24.2. Проектирование и язык программирования.....................797
24.2.1. Отказ от классов.................................899
24.2.2. Отказ от наследования............................801
24.2.3. Отказ от статической проверки типов..............802
24.2.4. Отказ от программирования........................805
24.2.5. Использование исключительно иерархий классов.....807
24.3. Классы.....................................................808
24.3.1. Что представляют классы?.........................808
24.3.2. Иерархии классов.................................810
24.3.2.1. Зависимости внутри иерархии классов....812
24.3.3. Отношения включения..............................814
24.3.4. Включение и наследование.........................816
24.3.4.1. Альтернатива «членство/иерархия».......819
24.3.4.2. Альтернатива «включение/иерархия»......820
24.3.5. Отношения использования..........................821
24.3.6. Запрограммированные отношения....................822
24.3.7. Отношения внутри класса..........................824
24.3.7.1. Инварианты.............................825
24.3.7.2. Утверждения............................826
24.3.7.3. Предусловия и постусловия..............829
24.3.7.4. Инкапсуляция...........................830
24.4. Компоненты.................................................831
24.4.1. Шаблоны..........................................833
24.4.2. Интерфейсы и реализации..........................835
24.4.3. Жирные интерфейсы................................837
24.5. Советы.....................................................839
Глава 25. Роли классов...................................................841
25.1. Разновидности классов......................................841
25.2. Конкретные типы............................................842
25.2.1. Повторное использование конкретных типов.........844
25.3. Абстрактные типы...........................................846
25.4. Узловые классы.............................................848
25.4.1. Изменение интерфейсов............................851
25.5. Действия...................................................853
25.6. Интерфейсные классы........................................855
25.6.1. Приспосабливающие интерфейсы.....................857
25.7. Вспомогательные классы.....................................859
25.7.1. Операции во вспомогательных классах..............862
25.8. Прикладные среды разработки................................863
25.9. Советы.....................................................865
25.10. Упражнения................................................866
======Приложения и предметный указатель ====== = = = = = = = = = = = = = 869
Приложение А. Грамматика.................................................871
А.1. Введение....................................................871
А.2. Ключевые слова..............................................871
А.З. Лексические соглашения......................................872
А.4. Программы...................................................876
А.5. Выражения...................................................876
А.6. Инструкции..................................................879
А.7. Объявления..................................................880
А.7.1. Объявители........................................883
А.8. Классы......................................................885
Л.8.1. Производные классы................................886
А.8.2. Особые функции-члены..............................887
А.8.3. Перегрузка........................................887
А.9. Шаблоны.....................................................887
А.10. Обработка исключений.......................................889
А.11. Директивы препроцессора....................................889
Приложение Б. Совместимость..............................................891
Б.1. Введение....................................................891
Б.2. Совместимость C/C++.........................................891
Б.2.1. "Тихие" различия..................................891
Б.2.2. Код на С, не являющийся кодом на С++..............892
Б.2.3. Нежелательные особенности.........................894
Б.2.4. Код на С++, не являющийся кодом на С..............895
Б.З. Старые реализации С++.......................................896
Б.3.1. Заголовочные файлы................................897
Б.3.2. Стандартная библиотека............................898
Б.3.3. Пространства имен.................................899
Б.3.4. Ошибки распределения памяти.......................899
Б.3.5. Шаблоны...........................................899
Б.3.6. Инициализаторы for-инструкции.....................901
Б.4. Советы......................................................901
Б.5. Упражнения..................................................902
Приложение В. Технические подробности....................................903
В.1. Введение и обзор............................................903
В.2. Стандарт....................................................903
В.3. Символьные наборы...........................................905
В.3.1. Сокращенный символьный набор......................905
В.3-2, Escape-символы....................................906
В.3.3. Большие символьные наборы.........................907
В.З.4. Знаковые и беззнаковые символы....................907
В.4. Типы целых литералов........................................908
В.5. Константные выражения.......................................909
В.6. Неявное преобразование типов................................909
В.6.1. Продвижения.......................................909
В.6.2. Преобразования....................................910
В.6.2.1. Интегральные преобразования.............910
В.6.2.2. Преобразования чисел с плавающей точкой.911
В.6.2.3. Преобразования указателей и ссылок......911
В.6.2.4. Преобразования указателей на члены......911
В.6.2.5. Преобразования в логические переменные..911
В.6.2.6. Преобразования чисел с плавающей точкой 911
в целые и обратно .......................911
В.6.3. Обычные арифметические преобразования.............912
В.7. Многомерные массивы.........................................913
В.7.1. Вектора...........................................913
В.7.2. Массивы...........................................914
В.7.3. Передача многомерных массивов.....................915
В.8. Экономия памяти.............................................916
В.8.1. Поля..............................................917
В.8.2. Объединения.......................................918
В.8.3. Объединения и классы..............................920
В.9. Управление памятью..........................................920
В.9.1. Автоматическая сборка мусора......................921
В.9.1.1. Замаскированные указатели...............921
В.9.1.2. delete..................................922
В.9.1.1. Деструкторы.............................922
В.9.1.4. Фрагментация памяти.....................923
В.10. Пространства имен..........................................924
В.10.1. Удобство против безопасности.....................924
В.10.2. Вложение пространств имен........................925
В.10.3. Пространства имен и классы.......................926
В.11. Контроль доступа...........................................926
В.11.1. Доступ к членам..................................926
В.11.2. Доступ к базовым классам.........................927
В.11.3. Доступ из членов-классов.........................928
В.11.4. Дружба...........................................929
В.12. Указатели на члены данных..................................930
В.13. Шаблоны....................................................931
В.13.1. Статические члены................................931
В.13.2. Друзья...........................................931
В.13.3. Шаблоны как параметры шаблона....................932
В.13.4. Выведение аргументов шаблона функции.............932
В.13.5. typename и шаблоны...............................933
В.13.6. template как квалификатор........................935
В.13.7. Инстанцированне..................................936
В.13.8. Связывание имен..................................936
В.13.8.1. Зависимые имена........................938
В.13.8.2. Связывание в точке определения.........939
В.13.8.3. Связываниевточкеинстаннирования........940
В.13.8.4. Шаблоны и пространства имен............941
В.13.9. Когда нужна специализация?.......................943
В.13.9.1. Инстанцированне шаблонов функций.......943
В.13.10. Явное ннстанцировапие...........................943
В. 14. Советы....................................................944
Приложение Г. Локализация................................................947
Г.1. Учет культурных различий....................................947
Г.1.1. Программирование культурных различий..............948
Г.2. Класс locale................................................951
Г.2.1. Именованные локализации..........................953
Г.2.1.1. Создание новых локализаций..............955
Г.2.2. Копирование и сравнение локализаций...............957
Г.2.3. Локализации global() и classic()..................958
Г.2.4. Сравнение строк...................................959
Г.З. Фасеты локализаций..........................................959
Г.З.1. Доступ к фасетам локализации......................961
Г.З.2. Простой определяемый пользователем фасет..........963
Г.3.3. Использование локализаций и фасетов...............966
Г.4. Стандартные фасеты..........................................966
Г.4.1. Сравнение строк...................................969
Г.4.1.1. Именованные фасеты сравнения............972
Г.4.2. Ввод и вывод чисел...............................972
Г.4.2.1. Пунктуация чисел........................973
Г.4.2.2. Вывод чисел.............................974
Г.4.2.3. Ввод чисел..............................977
Г.4.3. Ввод и вывод денежных значений...................979
Г.4.3.1. Пунктуация денег........................980
Г.4.3.2. Вывод денежных значений ................982
Г.4.3.3. Ввод денежных значений..................983
Г.4.4. Ввод и вывод дат н времени.......................985
Г.4.4.1. Часы и таймеры..........................985
Г.4.4.2. Класс Date..............................988
Г.4.4.3. Вывод даты и времени....................989
Г.4.4.4. Ввод дат и времени......................991
Г.4.4.5. Более гибкий класс Date.................993
Г.4.4.6. Задание формата даты....................995
Г.4.4.7. Фасет ввода даты........................997
Г.4.5. Классификация символов...........................1001
Г.4.5.1. Некоторые удобные интерфейсы...........1005
Г.4.6. Преобразование кода символа......................1005
Г.4.7. Сообщения........................................1009
Г.4.7.1. Использование сообщений из других фасет1012ов
Г.5. Советы.....................................................1013
Г.6. Упражнения.................................................1014
Приложение Д. Безопасность исключений и стандартная библиотека..........1017
Д.1. Введение...................................................1017
Д.2. Безопасность исключений....................................1019
Д.З. Безопасные при исключениях методы реализации...............1022
Д.3.1. Простой вектор...................................1023
Д.3.2. Явное представление памяти.......................1026
Д.3.3. Присваивание.....................................1028
Д.3.4. push_back()......................................1031
Д.3.5. Конструкторы и инварианты........................1032
Д.З.5.1. Использование функций init()...........1034
Д.3.5.2. Надежда на действительное состояниепо п1035о умолчанию
Д.3.5.3. Задержка выделения ресурса.............1036
Д.4. Гарантии стандартных контейнеров...........................1037
Д.4.1. Вставка и удаление элементов.....................1039
Д.4.2. Гарантии и компромиссы...........................1041
Д.4.3. Перестановка swap()..............................1044
Д.4.4. Инициализация и итераторы........................1044
Д.4.5. Ссылки на элементы...............................1045
Д.4.6. Предикаты........................................1046
Д.5. Другие части стандартной библиотеки........................1047
Д.5.1. Строки...........................................1047
Д.5.2. Потоки...........................................1047
Д.5.3. Алгоритмы........................................1048
Д.5.4. Valarray и Complex...............................1049
Д.5.5. Стандартная библиотека Си........................1049
Д.6. Значение для пользователей библиотеки......................1049
Д.7. Советы.....................................................1052
Д.8. Упражнения.................................................1052
Предметный указатель....................................................1055