Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ для начинающих (Стенли Липпман) 3-е хххх.pdf
Скачиваний:
84
Добавлен:
30.05.2015
Размер:
5.92 Mб
Скачать

С++ для начинающих

1162

#include <algorithm> #include <vector> #include <assert.h> #include <iostream.h>

template <class Type>

void print_elements( Type elem ) { cout << elem << " "; }

void (*pfi)( int ) = print_elements;

int main()

{

int ia[] = {29,23,20,22,17,15,26,51,19,12,35,40}; vector<int,allocator> vec(ia,ia+12);

sort(ia,ia+12);

int *iter = upper_bound(ia,ia+12,19); assert( *iter == 20 );

sort( vec.begin(), vec.end(), greater<int>() ); vector<int,allocator>::iterator iter_vec;

iter_vec = upper_bound( vec.begin(), vec.end(), 27, greater<int>() );

assert( *iter_vec == 26 );

// печатается: 51 40 35 29 27 26 23 22 20 19 17 15 12 vec.insert( iter_vec, 27 );

for_each( vec.begin(), vec.end(), pfi ); cout << "\n\n";

}

Алгоритмы для работы с хипом

В стандартной библиотеке используется макс-хип. Макс-хип это представленное в виде массива двоичное дерево, для которого значение ключа в каждом узле больше либо равно значению ключа в каждом из узлов-потомков. (Подробное обсуждение макс-хипа можно найти в [SEDGEWICK88]. Альтернативой ему является мин-хип, для

которого значение ключа в каждом узле меньше либо равно значению ключа в каждом из узлов-потомков.) В реализации из стандартной библиотеки самое большое значение (корень дерева) всегда оказывается в начале массива. Например, приведенная последовательность букв удовлетворяет требованиям, накладываемым на хип:

X T O G S M N A E R A I

В данном примере X это корневой узел, слева от него находится T, а справа O. Обратите внимание, что потомки не обязательно должны быть упорядочены (т.е. значение в левом узле не обязано быть меньше, чем в правом). G и S потомки узла T, а M и N потомки узла O. Аналогично A и E потомки G, R и A потомки S, I левый потомок M, а N листовой узел без потомков.

Четыре обобщенных алгоритма для работы с хипом: make_heap(), pop_heap(), push_heap() и sort_heap() поддерживают его создание и различные манипуляции. В последних трех алгоритмах предполагается, что последовательность, ограниченная

С++ для начинающих

1163

парой итераторов, – действительно хип (в противном случае поведение программы не определено). Заметим, что список нельзя использовать как контейнер для хранения хипа, поскольку он не поддерживает произвольный доступ. Встроенный массив для размещения хипа использовать можно, но в этом случае трудно применять алгоритмы pop_heap() и push_heap(), так как они требуют изменения размера контейнера. Мы опишем все четыре алгоритма, а затем проиллюстрируем их работу на примере небольшой программы.

template< class RandomAccessIterator > void

make_heap( RandomAccessIterator first, RandomAccessIterator last );

template< class RandomAccessIterator, class Compare > void

make_heap( RandomAccessIterator first,

Алгоритм make_heap()

RandomAccessIterator last, Compare comp );

make_heap() преобразует в хип последовательность, ограниченную диапазоном [first,last). В первом варианте для сравнения используется оператор меньше”, определенный для типа элементов контейнера, а во втором операция comp.

template< class RandomAccessIterator > void

pop_heap( RandomAccessIterator first, RandomAccessIterator last );

template< class RandomAccessIterator, class Compare > void

pop_heap( RandomAccessIterator first,

Алгоритм pop_heap()

RandomAccessIterator last, Compare comp );

pop_heap() в действительности не исключает наибольший элемент, а переупорядочивает хип. Он переставляет элементы в позициях first и last-1, а затем перестраивает в хип последовательность в диапазоне [first,last-1). После этого вытолкнутыйэлемент можно получить посредством функции-члена back() контейнера либо по-настоящему исключить его с помощью pop_back(). В первом варианте при сравнении используется оператор меньше”, определенный для типа элементов контейнера, а во втором операция comp.

С++ для начинающих

1164

template< class RandomAccessIterator > void

push_heap( RandomAccessIterator first, RandomAccessIterator last );

template< class RandomAccessIterator, class Compare > void

push_heap( RandomAccessIterator first,

Алгоритм push_heap()

RandomAccessIterator last, Compare comp );

push_heap() предполагает, что последовательность, ограниченная диапазоном [first,last-1),хип и что новый добавляемый к хипу элемент находится в позиции last-1. Все элементы в диапазоне [first,last) реорганизуются в новый хип. Перед вызовом push_heap() необходимо вставить новый элемент в конец контейнера, возможно, применив функцию push_back() (это показано в примере ниже). В первом варианте при сравнении используется оператор меньше”, определенный для типа элементов контейнера; во втором операция comp.

template< class RandomAccessIterator > void

sort_heap( RandomAccessIterator first, RandomAccessIterator last );

template< class RandomAccessIterator, class Compare > void

sort_heap( RandomAccessIterator first,

Алгоритм sort_heap()

RandomAccessIterator last, Compare comp );

sort_heap() сортирует последовательность в диапазоне [first,last), предполагая, что это правильно построенный хип; в противном случае поведение программы не определено. (Разумеется, после сортировки хип перестает быть хипом!) В первом варианте при сравнении используется оператор меньше”, определенный для типа элементов контейнера, а во втором операция comp.

С++ для начинающих

1165

#include <algorithm> #include <vector> #include <assert.h>

template <class Type>

void print_elements( Type elem ) { cout << elem << " "; }

int main()

{

int ia[] = { 29,23,20,22,17,15,26,51,19,12,35,40 }; vector< int, allocator > vec( ia, ia+12 );

// печатается: 51 35 40 23 29 20 26 22 19 12 17 15 make_heap( &ia[0], &ia[12] );

void (*pfi)( int ) = print_elements; for_each( ia, ia+12, pfi ); cout << "\n\n";

//печатается: 12 17 15 19 23 20 26 51 22 29 35 40

//минимальный хип: в корне наименьший элемент

make_heap( vec.begin(), vec.end(), greater<int>() ); for_each( vec.begin(), vec.end(), pfi ); cout << "\n\n";

// печатается: 12 15 17 19 20 22 23 26 29 35 40 51 sort_heap( ia, ia+12 );

for_each( ia, ia+12, pfi ); cout << "\n\n";

//добавим новый наименьший элемент vec.push_back( 8 );

//печатается: 8 17 12 19 23 15 26 51 22 29 35 40 20

//новый наименьший элемент должен оказаться в корне push_heap( vec.begin(), vec.end(), greater<int>() );

for_each( vec.begin(), vec.end(), pfi ); cout << "\n\n";

//печатается: 12 17 15 19 23 20 26 51 22 29 35 40 8

//наименьший элемент должен быть заменен на следующий по порядку

pop_heap( vec.begin(), vec.end(), greater<int>() ); for_each( vec.begin(), vec.end(), pfi ); cout << "\n\n";

}

 

подвижные (volatile), 611–14

#

Д

#include, директива

 

использование с using-директивой, 68, 427

деструктор(ы)

использование с директивой связывания, 354

для элементов масс??а

 

освобождение динамической памяти, 693–

*

94

abort(), функция

 

умножения оператор

вызов из terminate() как подразумеваемое

комплексных чисел, 155

поведение, 541

 

abs(), функция

ч

поддержка для комплексных чисел, 156

accumulate(), обобщенный алгоритм, 1104

 

члены класса

adjacent_difference(), обобщенный алгоритм,

функции-члены

1106

константные, 611–14

adjacent_find(), обобщенный алгоритм, 1107

С++ для начинающих

ainooi

к базовому классу, 880–88 algorithm, заголовочный файл, 584 any(), функция

в классе bitset, 167 append(), функция

конкатенация строк, 287 argc, переменная

счетчик аргументов в командной строке, 356 argv, массив

для доступа к аргументам в командной строке, 356

assert(), макрос, 51

использование для отладки, 226 at(), функция

контроль выхода за границы диапазона во время выполнения, 289

atoi(), функция

применение для обработки аргументов в командной строке, 360

auto_ptr, шаблон класса, 395–400 memory, заголовочный файл, 395 инициализация, 397 подводные камни, 399

aункции

интерфейс включение объявления исключений в, 546

B

back(), функция поддержка очереди, 316

back_inserter(), адаптор функции

использование в операции вставки push_back(), 577

begin(), функция

итератор возврат с помощью, 578

использование, 261

binary_search(), обобщенный алгоритм, 1108 bind1st(), адаптор функции, 573

bind2nd(), адаптор функции, 573 bitset, заголовочный файл, 168 bitset, класс, 165

size(), функция, 167 test(), функция, 167 to_long(), функция, 170 to_string(), функция, 170

заголовочный файл bitset, 168 оператор доступа к биту ([]), 167 операции, 168–71

break, 218–19 break, инструкция

использование для выхода из инструкции switch, 203

сравнение с инструкцией return, 346

C

C, язык

символьные строки динамическое выделение памяти для, 401

необходимость доступа из класса string, 128

1166

отсутствие завершающего нуля как программная ошибка, 402

C_str(), функция

преобразование объектов класса string в C- строки, 137

C++, язык

std, пространство имен, 426–28 введение в (глава), 12–13

компоненты

(часть 2), 319

типы данных (глава), 98–140 предопределенные операторы (таблица), 727

case, ключевое слово

использование в инструкции switch (таблица), 202

catch-обработчик, 62, 534, 537

критерий выбора, 63 определение, 537

универсальный обработчик, 543–45 cerr, 26

представление стандартного вывода для ошибок с помощью, 1041

char *, указатель

работы с C-строками символов, 92 char, тип, 76

check_range(), пример функции как закрытая функция-член, 51

cin, 26

использование итератора istream_iterator, 579

представление стандартного ввода с помощью, 1041

class, ключевое слово typename как синоним, 479

использование в определении класса, 594

использование в определении шаблона класса, 801

использование в параметрах-типах шаблона класса, 800 функции, 476

const, квалификатор

вопросы разрешения перегрузки функций параметры-типы, 432

вопросы разрешения перезагрузки функций использование преобразования

квалификаторов, 449 ранжирование преобразований, связанных

с инициализацией ссылочных параметров, 473

константная функция-член, 611–14 константные объекты, динамическое

выделение и освобождение памяти, 402–3

константные параметры параметры-ссылки с квалификатором

const, 330, 340

передача массива из константных элементов, 336

константный итератор, 262 контейнеры, необходимость константного

итератора, 575 преобразование объектов в константы, 101

сравнение с volatile, 127

ссылка, инициализация объектом другого типа, 105

указатели на константные объекты, 101

С++ для начинающих

const_cast, оператор, 180 continue, инструкция, 219

copy(), обобщенный алгоритм, 1109 использование класса inserter, 305 конкатенация векторов с помощью, 557

count(), обобщенный алгоритм, 1112

использование istream_iterator и ostream_iterator, 581

использование с контейнерами multimap и multiset, 311

использование с множествами, 306 использование с отображениями, 298

count(), функция

в классе bitset, 167

count_if(), обобщенный алгоритм, 1114 cout, 26

представление стандартного вывода с помощью, 1041

cпецификации

исключений для документирования исключений, 546

D

default, ключевое слово

использование в инструкции switch, 202, 205 delete, оператор, 35, 162–63, 744–53

безопасное и небезопасное использование, примеры, 394

для массивов, 749–51 объектов класса, 750 синтаксис, 402

для одиночного объекта, 392 использование класса-распределителя памяти

(сноска), 256

размещения, 751–53

deque (двустороння очередь, дека)

использование итераторов с произвольным доступом, 583

как последовательный контейнер, 248–301 применение для реализации стека, 314 требования к вставке и доступу, 252

do-while, инструкция, 216–18

сравнение с инструкциями for и while, 209

E

иници??изация

массива динамически выделенных объектов

классов, 691–94 копиру??ий

конструктор, 680–82 end(), функция

итератор, использование, 261 endl, манипулятор потока iostream, 27 enum, ключевое слово, 112 equal_range(), обобщенный алгоритм

использование с контейнерами multimap и multiset, 310

extern "C"

и перегруженные функции, 438–39 неприменимость безопасного связывания, 440 указатели на функции, 373–75

1167

extern, ключевое слово

использование с указателями на функции, 373 использование с членами пространства имен,

418

как директива связывания, 354

объявление константы, 386

шаблона функции, 481

объявления объектов без определения, 382

размещение в заголовочном файле, 384

F

f, суффикс

нотация для литерала с плавающей точкой одинарной точности, 77

find(), обобщенный алгоритм использование с контейнерами multiset и

multimap, 309

поиск объектов в множестве, 306

поиск подстроки, 273 поиск элемента отображения, 298

find_first_of(), обобщенный алгоритм нахождение знаков препинания, 280 нахождение первого символа в строке, 273

find_last_ of(), 279 find_last_not_of(), 279 for, инструкция, 209–12

использование с инструкцией if, 196 front(), функция

поддержка очереди, 316 front_inserter(), адаптор функции

использование в операции push_front(), 577 fstream, класс

файловый ввод / вывод, 1042 full(), функция

модификация алгоритма динамического роста стека, 317

functional, заголовочный файл, 568

G

get(), функция, 1063–66 getline(), функция, 270, 1066–68 goto, инструкция, 219–22 greater, объект-функция, 571

greater_equal, объект-функция, 571

I

i?enaaeaaiea

почленное для объектов класса, 925–29 i?iecaiaiua eeannu

ae?ooaeuiua ooieoee, 899–925

определение при одиночном наследовании, 876–78

присваивание

оператор перегруженный, 925–29

if, инструкция, 192–98 If, инструкция

условный оператор как альтернатива, 158 insert(), функция

С++ для начинающих

вставка символов в строку, 286 добавление элементов в множество, 305 реализация, 266 списки, 222

inserter(), адаптор функции

для вставки с помощью insert(), 577 inserter, класс, 305

Iomanip, заголовочный файл, 136 iostream библиотека

iostream.h, заголовочный файл, пример использования, 563

ввод

istream_iterator, 579

итератор чтения, 582

вывод

ostream_iterator, 580–82

итератор записи, 582 итератор чтения, 582

итераторы, 578–82

манипуляторы endl, 27

операторы, сцепление, 28–29 iostream.h, заголовочный файл

пример использования для манипуляций с текстом, 563

isalpha(), функция, 206

ctype, заголовочный файл, 283 isdigit(), функция

ctype, заголовочный файл, 283 ispunct(), функция

ctype, заголовочный файл, 283 isspace(), функция

ctype, заголовочный файл, 283 istream_iterator, 579–80

iterator, заголовочный файл, 578

L

less, объект-функция, 572 less_equal, объект-функция, 572 limits, заголовочный файл, 145 list, заголовочный файл, 256 locale, заголовочный файл, 283 l-значение, 81

как возвращаемое значение, подводные камни, 348

оператор присваивания, требования, 149 преобразования, 447

преобразование точного соответствия, 445

точное соответствие при разрешении перегрузки функций, 457

трансформация, 450, 469

преобразование аргументов шаблона функции, 486

M

main(), 15

обработка аргументов в командной строке, 356–65

map, заголовочный файл, 293

использование с контейнером multimap, 309 memory, заголовочный файл, 395

merge(), обобщенный алгоритм

1168

специализированная версия для спискаов, 588 minus(), объект-функция, 570

modulus, объект-функция, 571

multimap (мультиотображение), контейнер, 309– 12

map, заголовочный файл, 310 сравнение с отображением, 303

multiplies, объект-функция, 570

multiset (мультимножество), контейнер, 309–12 set, заголовочный файл, 310

N

negate, объект-функция, 571 new оператор, 162–63

для константных объектов, 403–4 для массивов, 400–402

классов, 749–51

для объектов классов, 745 для одиночных объектов, 392–95

использование класса распределителя памяти

(сноска), 256

оператор размещения new, 403–4 для объектов класса, 751–53

спецификации исключений, 546–50

и указат??и на функции, 548–50 статические члены класса, 621–27

данные-члены, 621–27 функции-члены, 626–27 not_equal_to, объект-функция

(код), 571

not1(), адаптор функции

как адаптор-отрицатель, 573 not2(), адаптор функции

как адаптор-отрицатель, 573 numeric, заголовочный файл, 584

использование численных обобщенных алгоритмов, 586

O

oaaeiiu eeannia

конкретизация, 800–811

члены шаблонов, 826–31

ofstream, тип, 1076–86

фун??ии-члены volatile, 611–14

функции-члены константные, 611–14

ostream_iterator, 580–82

P

pair, класс, 127

использование для возврата нескольких значений, 197

plus, объект-функция, 568, 570 pop_back(), функция

для удаления элементов из последовательного контейнера, 267

использование для реализации динамического роста стека, 317

С++ для начинающих

push_back(), функция

векторы, вставка элементов, 123 поддержка в контейнерах, 257 стеки, использования для динамического

выделения памяти, 317 push_front(), функция

поддержка в списковых контейнерах, 257 pаголовочные файлы

содержимое объявления функций, с включением явной

спецификации исключений, 546

Q

queue, заголовочный файл, 315

R

register, ключевое слово, 389–90 reinterpret_cast, оператор

опасности, 181 reinterpret_cast, оператор, 181 release()б функция

управление объектами с помощью класса auto_ptr, 400

reserve(), функция

использование для установки емкости контейнера, 255

reset(), функция

в классе bitset, 167

установка указателя auto_ptr, 398 resize(), функция

использование для изменения размера контейнера, 258

return, инструкция

завершение функции с помощью, 346

неявное преобразование типа в, 176

сравнение с выражением throw, 531 r-значение, 81

использование при вычислении выражений, 141

S

set, заголовочный файл, 304, 310 size(), функция

для модификации алгоритма выделения памяти в стеке, 317

sizeof, оператор, 159–62

использование с типом ссылки, 161 использование с типом указателя, 161 как константное выражение, 162

sort(), обобщенный алгоритм вызов, 120

передача объекта=функции в качестве аргумента, 569

stack, заголовочный файл, 312 static_cast

сравнение с неявным преобразованием, 180 static_cast, оператор

опасности, 181

std, пространство имен, 426–28 string, заголовочный файл, 67 string, строковый тип, 95–98

1169

substr(), функция, 275

пустая строка, 96

смешение объектов типа string и C-строк, 97 switch, инструкция, 207

использование ключевого слова case, 202 использование ключевого слова default, 202,

205

T

terminate(), функция, 541 this, указатель, 616–20 tolower(), функция

locale, заголовочный файл, 283 преобразование заглавных букв в строчные,

283 toupper(), функция

ctype, заголовочный файл, 283 locale, заголовочный файл, 283

true, ключевое слово, 108 typedef

для объявления указателя на функцию, 372 для улучшения читабельности, 295, 369 как синоним существующего имени типа, 431 массива указателей на функции, 369

typename, 242

использование с параметрами шаблона функции, 480

U

unexpected(), функция

для обработки нераспознанных исключений, 547

unique(), обобщенный алгоритм удаление дубликатов из вектора, 557

unique_copy(), обобщенный алгоритм

запись целых чисел из вектора в стандартный вывод, 579

using-директивы, 423–26

влияние на разрешение перегрузки функции, 463

для объявления перегруженных функций, 437–38

сравнение с using-объявлениями, 423–26 using-объявления, 422–23

влияние на разрешение перегрузки функции, 462

для объявления перегруженных функций, 434–36

сравнение с using-директивами, 423–26 utility, заголовочный файл, 127

V

vector, заголовочный файл, 70, 121, 256 void

в списке параметров функции, 325 указатель, 179

void*

преобразование в void* как стандартное преобразование, 456

volatile, квалификатор, 127

С++ для начинающих

для типа параметра, в связи с перегрузкой функций, 432

для функции-члена, 611–14

использование преобразования квалификаторов, 471

преобразование квалификаторов, 449

W

while, инструкция, 213–16

сравнение с инструкциями for и do-while, 209

А

абстракция объекта, класс комплексных чисел как

пример, 154 стандартная библиотека, преимущества

использования, 165 автоматические объекты, 388–90

объявление с ключевым словом register, 389– 90

особенности хранения, 388

адапторы функций, для объектов-функций, 573

адапторы функций, 573 адрес(а)

как значение указателя, 88 конкретизированных шаблонов функций, 484

алгоритм(ы)

функция выведение аргумента шаблона, 489

разрешение перегрузки, 511 шаблон как, 475

аргумент(ы), 321 передача, 345

использование указателей для, 87 передача по значению, 327 по умолчанию, 340–43

должны быть хвостовыми, 341

ивиртуальные функции, 913

иустоявшие функции, 472–73

тип

преобразования, разрешение перегрузки функции, 444–60

преобразования, расширение типа, 451–53 преобразования, ссылок, 457–59 преобразования, стандартные, 453–57

шаблона класса для параметров-констант, 805–9

для параметров-типов, 800–811

шаблонов функции явные, 490–93

шаблонов функций выведение аргументов, 485–90

явная спецификация, мотивировка, 492 явная спецификация, недостатки, 492 явное специфицирование, 490

арифметические исключения, 143 объекты-функции, 570 операторы, 142–45

таблица, 142

1170

операции, поддержка для комплексных чисел, 126

преобразования, 175, 142–45 bool в int, 109

неявное выполнение при вычислении выражений, 175

типов, расширение типа перечисления, 112

указатели, 90

ассоциативность операторов, влияние на вычисление

выражений, 171–74 порядок вычисления подвыражений, 142

ассоциативные контейнеры, 248–301

неприменимость обобщенных алгоритмов переупорядочения, 587

ассоциирование

значений, использование класса pair, 127

Б

базовые классы абстрактные базовые классы, 865–69, 908

видимость классов при виртуальном наследовании, 983–84

видимость членов при множественном наследовании, 968–71

при одиночном наследовании, 966–68 виртуальные базовые классы, 974–87 деструкторы, 896–99

доступ

кбазовым классам, 958–64

кзакрытым базовым классам, 963

кзащищенным членам, 871

кчленам, 880–88

доступ к элементам отображения с помощью, 299

конструирование виртуальное наследование, 974–82

множественное наследование, 950–51

одиночное наследование, 889–96 почленная инициализация, 925–27

конструкторы, 889–99

определение базового класса при виртуальном наследовании, 976–78

при множественном наследовании, 950–55 при одиночном наследовании, 871–75

преобразование к базовому классу, 865–69

при выведении аргументов шаблона функции, 487

присваивание, почленное присваивание, 927– 29

байты

запись с помощью put(), 1063 чтение с помощью get(), 1063–66

безопасное связывание, 384 перегруженных функций, 440

бесконечный рекурсия, 351

цикл, избежание в операциях поиска в строке, 274

бинарные операторы, 141

битовое поле

С++ для начинающих

как средство экономии памяти, 643–45 битовый вектор, 164

в сравнении с классом bitset, 164

блок

try-блок, 533–37

инструкций, 188 комментария, 24 функции, 321

функциональный try-блок, 533–37 и конструкторы, 1024–26

больше (>), оператор поддержка в арифметических типах данных,

30

булевский(е)

константы, операторы, дающие в результате, 146

стандартные преобразования при разрешении перегрузки функции, 453

тип bool, 108–10

В

вектор(ы)

find(), обобщенный алгоритм, 554 емкость, связь с размером, 258 идиоматическое употребление в STL, 123 объектов класса, 689–96 присваивание, сравнение со встроенными

массивами, 122 сравнение со списками, 251–52

требования к вставке и доступу, 252 увеличение размера, 253–56

вертикальная табуляция ()

как escape-последовательность, 77 взятия адреса (&) оператор

использование в определении ссылки, 104, 105

использование с именем функции, 367 как унарный оператор, 141

взятия индекса оператор ([]), 736 использование в векторах, 121 использование в классе bitset, 168 использование в отображениях, 294

отсутствие поддержки в контейнерах multimap и multiset, 312

взятия остатка, оператор (%), 142

видимость определения символической константы, 386

переменных в условии цикла, 211, 379–81 роль в выборе функции-кандидата при

разрешении перегрузки функции, 460 требование к встроенным функциям, 353, 387 членов класса, 607, 645–52

висячий

проблемы висячего else, описание и устранение, 195

указатель, 389

как проблема динамически выделенного объекта, 394

возврат каретки (\\r)

как escape-последовательность, 77 время жизни, 381

auto_ptr, влияние на динамически выделенные объекты, 395

1171

автоматических объектов, 388 динамически выделенных объектов, 392

сравнение с указателями на них, 394 и область видимости (глава), 376–428

локальных объектов автоматических и статических, 388

влияние раскрутки стека на объекты типа класса, 541

проблема возврата ссылки на локальный объект, 348

вставка элементов

ввектор, 123

вконтейнер, с помощью адапторов функций, 577

вконтейнеры multimap и multiset, 311

вотображение, 294

впоследовательные контейнеры, 265

встек, 314

использование push_back(), 257

итераторы, обозначение диапазона, 575–77

различные механизмы для разных типов контейнеров, 252

встроенные функции, 133, 322 объекты-функции, 559, 566 объявление, 352–53

шаблонов функций как, 481 определение, размещение в заголовочном

файле, 385 перегруженные операторы вызова, 559 преимущества, 352

сравнение с не-встроенными функциями- членами, 605–7

встроенный(е)

массивы запрет иниициализации другим массивом,

115

запрет использования в качестве возвращаемого значения функции, 324

запрет присваивания другому массиву, 324 запрет ссылаться на, 115 инициализация при выделении из хипа,

400

отсутствие поддержки операции erase(), 557

поддержка в обобщенных алгоритмах, 553 сравнение с векторами, 122

типы данных арифметические, 30–33

выполнение непоследовательные инструкции, 20 условное, 20

выражения

(глава), 141–87

использование аргументов по умолчанию, 342

порядок вычисления подвыражений, 142 разрешение имен, 377

вычисление логических операторов, 146

порядок вычисления подвыражений, 142

вычитание

minus, объект-функция, 570 комплексных чисел, 154

С++ для начинающих

Г

глобальное пространство имен проблема засорения, 66, 406

глобальные объекты и функции, 381–87

сравнение с параметрами и возвращаемыми значениями функций, 349–50

глобальные функции, 381 горизонтальная табуляция (\\t)

как escape-последовательность, 77

Д

данные члены, 595–96 данные-члены

битовые поля, 643–45

изменчивые (mutable), 614–16

статические, 621–28 в шаблонах классов, 821–24

указатель this, 616–21

члены базового и производного классов, 870– 79

двойная кавычка (\\ ")

как escape-последовательность, 77 двойная обратная косая черта (\\)

как escape-последовательность, 77 двунаправленный итератор, 583 декремента оператор (--)

встроенный, 153–54 перегруженный, 740–44 постфиксная форма, 153, 743 префиксная форма, 153, 742

деление комплексных чисел, 155 целочисленное, 143

деления по модулю оператор (%), 142 деструктор(ы), 682–89

для элементов массива, 690

динамическое выделение памяти для массива, 162, 400–402

исчерпание памяти, исключение bad_alloc, 393

как требование к динамически растущему вектору, 253

объектов, 392–406

управление с помощью класса auto_ptr, 395

динамическое освобождение памяти для массивов, 400–402 объектов, 392–406

константных, 402–3 одиночных объектов, 392–95

оператор delete, 134, 392, 394, 744–53

управление с помощью класса auto_ptr, 395 утечка памяти, 395

директивы, 21–24 директивы связывания, 353–55

в связи с перегрузкой, 438 использование с указателями на функции, 373

для элементов массива динамическое выделение памяти, 691–94

доступ к контейнеру

использование итератора для, 261

1172

последовательный доступ как критерий выбора типа, 252

кмассиву, 31 индекс, 45

индексирование, 113

кпространству имен

механизмы, компромиссные решения, 68

к членам, 598–99, 607–8

оператор доступа к членам ->, 740 произвольный, итератор с произвольным

доступом, 583

уровни, protected, 49 друзья, 730–33

и специальные права доступа, 137, 599–600 перегруженные операторы, 730–33 См. также доступ, класс(ы), наследование,

815–21

Е

емкость контейнерных типов в сравнении с размером, 253

начальная, связь с размером, 258

З

забой (, 77

заголовочные файлы как средство повторного использования

объявлений функций, 323

по имени algorithm, 72, 584 bitset, 167 complex, 125 fstream, 1042 functional, 568 iomanip, 136 iterator, 578 limits, 145 locale, 283

map, 293 memory, 395 numeric, 584, 586 queue, 315

set, 304 sstream, 1044 stack, 312 string, 68

vector, 70, 121, 256

предкомпилированные, 385

содержимое включение определения шаблона функции,

преимущества и недостатки, 495 встроенные функции, 353 директивы связывания, 354 объявления, 82, 385–87

объявления явных специализаций шаблонов, 503

спецификация аргументов по умолчанию, 341

запись активации, 327 автоматическое включение объектов в, 388

запятая (,)

С++ для начинающих

неправильное использование для индексации массива, 117

оператор, 163 звонок ()

как escape-последовательность, 77 знак вопроса ()

как escape-последовательность, 77

И

И, оператор, 142 идентификатор, 83

использования в качестве спецификатора типа класса, 129

как часть определения массива, 113 соглашения по именованию, 83

иерархии определение, 862–69

идентификация членов, 870–80 исключений, в стандартной библиотеке

C++, 1026–29

поддержка мезанизма классов, 128

изменчивый (mutable) член, 614–16

именование соглашения об именовании идентификаторов,

83

имя, 83

typedef, как синоним, 126–27

именование членов класса, 607–8 квалифицированные имена, 410–12

статических членов класса, 622–23 членов вложенных пространств имен, 412–

14

шаблонов функций как членов пространства имен, 524

область видимости объявления, 376

параметра шаблона функции, 478

перегруженные операторы, 727–28 переменной, 83 псевдонимы пространства имен, как

альтернативные имена, 420–21 разрешение, 377

влокальной области видимости, 379

вобласти видимости класса, 649–52

вопределении шаблона функции, 514–20

инициализация векторов, 121

сравнение с инициализацией встроенных массивов, 122

комплексного числа, 154

массива динамически выделенного, 400

динамически выделенных объектов классов, 749

многомерного, 116 указателей на функции, 369

недопустимость инициализации другим массивом, 115

объектов автоматических, 388

автоматических, по сравнению с локальными статическими, 391

1173

глобальных, инициализация по умолчанию, 382

динамически выделенных, 393 константных, 101 статических локальных, 390, 391

поведение auto_ptr, 397

сравнение с присваиванием, 148 ссылок, 104 указателя на функцию, 367

влияние на спецификацию исключений, 549

вопросы, связанные с перегруженными функциями, 439

инкремента оператор (++) встроенный, 154 перегруженный, 740–44 постфиксная форма, 153, 743 префиксная форма, 153, 742

инструкции, 188–98 break

для выхода из инструкции switch, 203 break, инструкция, 218–19

continue, 219 do-while, 216–17

сравнение с инструкциями for и while, 209 for, 209–13

goto, 219–21 if, 20, 192–98

if-else, условный оператор как альтернатива, 158

switch, 201–3

использование ключевого слова default, 202, 205

while, 213–16

сравнение с инструкциями for и do-while, 209

блок, 188 объявления, 189–92 простые, 188–89 составные, 188–89

инструкция while, 21

использование преобразования квалификаторов, 449

использование шаблонов, 62 итератор с произвольным доступом, 583

итератор(ы), 123, 261

begin(), доступ к элементам контейнера, 261 end(), доступ к элементам контейнера, 261 iterator, заголовочный файл, 578 абстракция, использование а обобщенных

алгоритмах для обхода, 552 адаптор, 557

вставка элементов в последовательные контейнеры, 266

доступ к подмножеству контейнера с помощью, 262

использование в обобщенных алгоритмах, 575–83

категории, 582–83 двунаправленный итератор, 583 итератор записи, 582

итератор с произвольным доступом, 583 итератор чтения, 582

С++ для начинающих

однонаправленный итератор, 583

обозначение интервала с включенной левой границей, 583

обратные итераторы, 578 потоковык итераторы ввода/вывода, 578–82

istream_iterator, 579–80 ostream_iterator, 580–82

запись целых чисел из вектора в стандартный вывод, 578

чтение целых чисел из стандартного ввода в вектор, 579

требования к поведению, выдвигаемые обобщенными алгоритмами, 584

удаление элементов из последовательного контейнера, 267

К

китайский язык поддержка двухбайтовых символьных

литералов, 77 класс(ы)

возвращаемые значения, 347–49 вопросы эффективности, 712–18

друзья, 599–600, 731

заголовок, 594 объединение, 638–43

объявление, сравнение с определением класса, 600–601

определение, 594–601 сравнение с объявлением класса, 600–601

параметры вопросы эффективности, 330, 712–18

для возврата сразу нескольких значений, 350

для передачи сразу нескольких параметров, 350

тело, 594

командная строка класс, 363–65 опции, 356–65

argc, argv - аргументы main(), 356

использование встроенного массива для обработки, 356

пример программы, 361–63 комментарии, 24–26

блочные, 25 комплексные числа, 18, 125–26

выражения с участием, 155 заголовочный файл complex, 125 как абстракция класса, 30 операции, 154–58 представление, 156 типы данных, 30

композиция объектов, 963–65

сравнение с наследованием, 960–62

конкретизация шаблона функции, 482

явное объявление специализации шаблона функции, 497–98

Конкретизация шаблона функции

разрешение перегрузки, 506–13

1174

конктеризация точка конкретизации, 518

константы константные выражения

sizeof() как пример, 162

размер массива должен быть, 113 литерал, 76–78 подстановка, 386

преобразование объектов в, 101 ссылки, рассматриваемые как, 104

конструктор(ы)

вызовы виртуальных функций в, 923–25 для базовых классов, 899

почленная инициализация, 925–30 при виртуальном наследовании, 974–82 при единичном наследовании, 896

при множественном наследовании, 950–51

для элементов массива список инициализации массива, 689–91

и функциональные try-блоки, 1024–26 как коверторы, 761–64 конструкторы по умолчанию, 678–79

для элементов вектора, 694–96 копирующие конструкторы, 237, 680–82

почленная инициализация, 703–9, 925–30 ограничение возможности созданий объектов,

680

список инициализации членов, 696–703

контейнерные типы определение, 256–61

контейнерные типы, 248–301 вопросы выделения памяти при копировании,

577

емкость, 253 связь с размером, 253–58

и итераторы, 261–65 инициализация, с помощью пары итераторов,

263

очереди с приоритетами, 315

параметры, 338–40, 350

преимущества, автоматическое управление памятью, 402

размер, 258 связь с емкостью, 253–56

требования к типам, с которыми конкретизируется контейнер, 259

копирование вопросы выделения памяти, 577

использование ссылок для избежания, 330 как операция инициализации, 258 массивов, 115

сравнение со стоимостью произвольного доступа, 252

строк, 96

копирующий конструктор, 43, 131

для динамического увеличения размера вектора, 255

оператор присваивания, реализация, 237

Л

лексикографическое упорядочение, 289

С++ для начинающих

1175

в обобщенных алгоритмах перестановок, 586

недопустимость присваивания другому

в обобщенныых алгоритмах сравнения, 586

массиву, 115

при сортировке строк, 366–75

недопустимость ссылок на массив, 115

литеральные константы, 76–78

обход

C-строки

с помощью манипуляции указателем, 118

сравнение с символьными литералами, 114

с помощью пары итераторов, 263–64

f суффикс, 77

объектов класса, 689–96

U суффикс, 76

определение, 30, 113

с плавающей точкой, 77

перегруженный оператор

логические встроенные операторы, 145–48

delete[], 749–51

оператор ИЛИ (||), 146

new[], 749–51

оператор НЕ (!), 147

поддержка обобщенными алгоритмами, 553

логические объекты-функции

размер, не является частью типа параметра,

logical_and, 572

335

logical_not, 572

связь с типом указателей, 118–20

logical_or, 572

указателей на функции, 369–70

локализация

меньше, оператор

влияние глобального объекта на, 349

поддержка в арифметических типах данных,

константной переменной или объекта, 100

30

локальность объявления, 190, 385

требование о поддержке типом элементов

на уровне файла, использование безымянного

контейнера, 259

пространства имен, 419

минус(-)

локальная область видимости, 376, 378–81

для выделения опций в командной строке,

try-блок, 535

357

доступ к членам в глобальной области

многоточие (...), 343–44

видимости, скрытым за локальными

использование в типах функций, 367

объектами, 411

множество (set), контейнерный тип

имена в пространстве имен, скрытые за

set, заголовочный файл, 304

локальными объектами, 414

size(), 307

переменная, неинициализированная, 388

обход, 306–7

разрешение имени, 379

ограничение на изменение порядка, 587

локальные объекты, 388–92

определени, 304–6

проблема возврата ссылки на, 348

поиск элементов, 306

статические, 388, 390–92

сравнение с отображением, 292

 

модели компиляции

М

с разделением, 834–37

шаблонов класса

 

массив(ы), 113–20

с включением, 833

в сравнении с векторами, 122

с разделением, 834–36

динамическое выделение и освобождение,

шаблонов классов, 831–38

400–402

шаблонов функций, 494–98

массивов объектов классов, 691–94, 744–

с включением, 494–95

53

с разделением, 495–97

индексирование, 31, 113–16

Н

многомерных массивов, 116–17

отсутствие контроля выхода за границы

наилучшая из устоявших функций, 442

диапазона, 116

инициализация, 31, 114–15

неинициализированный

динамически выделенных массивов, 400

автоматический объект, 388

динамически выделенных массивов

глобальный объект, 382

объектов класса, 690–94

локальный статический объект, 391

многомерных массивов, 116–17

неоднозначность

недопустимость инициализации другим

перегруженных

массивом, 115

функций, диагносцирование во время

использование оператора sizeof(), 159

разрешения перегрузки, 454

как параметры функций, 335–39

указателя, стандартные преобразования, 456

для передачи нескольких параметров, 350

шаблона функции

многомерные, 338

аргумента, разрешение с помощью явной

преобразование массива в указатель, 448

спецификации, 492

многомерные, 116–17

конкретизации, ошибка, 484

недопустимость использования auto_ptr, 395

конкретизация, опасность перегрузки, 505

недопустимость использования в качестве

неявные преобразования типов, 176

возвращаемого значения функции, 324

новая строка ()

 

как escape-последовательность, 77

С++ для начинающих

1176

О

параллельный обход двух векторов, 296

область видимости, 376–81

объединение

разновидность класса, 638–43

видимость класса, 645–52

объект(ы)

и определение класса, 594

автоматические, 388–89

разрешение имен в, 649–52

объявление с ключевым словом register,

глобальная область видимости, 376

389–90

и время жизни (глава), 376–428

глобальные

и перегрузка, 434–38

и функции, 381–87

локальная область видимости, 378–81

сравнение с параметрами и

обращение к скрытым членам глобальной

возвращаемыми значениями функций,

области видимости, 411

349–50

разрешение имен в, 379

использование памяти, 82

объявлений исключений в catch-

локальные, 388–92

обработчиках, 540

определение, 87

параметра шаблона

переменные как, 81

функции, 478–81

члены пространства имен, 407–8

пространства имен, 376

объектное программирование, 593

управляющих переменных в инструкции for,

объектно-ориентированное программирование

379

проектирование

область видимости глобального пространства

(пример), 46–55

имен, 376, 406

объекты-функции, 566–75

доступ к скрытым членам с помощью

functional, заголовочный файл, 568

оператора разрешения области видимости,

арифметические, 570

411

использование в обобщенных алгоритмах,

обобщенные алгоритмы

552

(глава), 552–92

источники, 568

algorithm, заголовочный файл, 584

логические, 572

numeric, заголовочный файл, 584

предопределенные, 568–70

алфавитный указатель (приложение), 1103–

преимущества по сравнению с указателями

94

на функции, 567

генерирования, 586

реализация, 573–75

использование итераторов, 575–83

сравнительные, 571

категории и описания, 583–87

Объекты-функции

когда не надо использовать, 587–92

адапторы функций для, 573

модификации, 586

объявление

независимость от типа, 552, 553

инструкция, 14

нотация для диапазона элементов, 583

объявления

обзор, 552–56

базового класса, виртуальное, 976–78

объекты-функции как аргументы, 567

в части инициализации цикла for, 210

использование предопределенных

видимость имени, вводимого объявлением,

объектов-функций, 569

376

перестановки, 586

друзей, в шаблоне класса, 815–21

подстановки, 585

и определение, 382–83

пример использования, 556–66

инструкция, 189–92

работа с хипом, 587

исключения, 538

сравнения, 586

класса bitset, 167

удаления, 585

объектов, 169

численные, 586

класса, сравнение с определением, 600–601

обработка исключений

локальность, 190

bad_alloc, исключение нехватки памяти, 393

перегруженное

обратная косая черта (

оператора, 131

как escape-символ, 280

функции, 429

как префикс escape-последовательности, 77

пространства имен, 407

обратные итераторы, 578

сопоставление объявлений в разных файлах,

обход

383

заполнение множества с помощью, 305

указателя на функцию, 366

использование с контейнерами multimap и

включение спецификации исключений в,

multiset, 309

548

множества, 306–7

функции, 322

невозможность обхода перечислений, 112

задание аргументов по умолчанию, 341

обход отображения, 303

как часть шаблона функции, 477

отображения текста на вектор позиций, 298–

размещение в заголовочном файле, 385

301

функции-члена, перегруженное, 776–78

С++ для начинающих

1177

шаблона функции определение используемых имен, 516 связь с определением, 515

требования к размещению явных объявлений конкретизации, 497

явная специализация, 499

явной конкретизации шаблона класса, 837–38 шаблона функции, 497–98

одиночная кавычка (_)

как escape-последовательность, 77 однонаправленный итератор, 583 оператор "меньше"

характеристики и синтаксис, 146 оператор ввода, 27 оператор вывода, 1045

перегрузка, 1069. См. cout. См. cout

оператор вызова функции, 736–38

операторы

встроенные

(глава), 141–87, 141–87 sizeof, 159–62

арифметические, 142–45 бинарные, 141

декремента (--), 153–54

доступа к членам класса (. и ->), 607–8 запятая, 163

инкремента (++), 153–54

логические, 145–48 побитовые, 164–66 приоритеты, 171–74 равенства, 145–48

разрешения области видимости ( ), 410–12

составного присваивания, 152 сравнения, 145–48

перегруженные delete, 744–49

delete(), размещения, 751–53 delete[], 749–51

new, 744–49

new(), размещения, 751–53 new[], 749–51

взятия индекса ([]), 736 вопросы проектирования, 728–30 вызова функции (()), 736–38

вызова функции для объектов-функций, 567

декремента (--), 740–44

доступа к членам (->), 738–40

имена, 727–28 инкремента (++), 740–44

объявленные как друзья, 730–33 присваивания (=), 733–35 с параметрами-ссылками, преимущества,

335

члены и не-члены класса, 723–27 определения, 15

typedef, 126

базового класса, 871–75 иерархии классов, 862–69

исключений, как иерархий классов, 1013–14

класса, 594–601

сравнение с определением класса, 600–601

класса-диспетчера запросов (пример), 934–39 массива, 113 многомерных массивов, 116 множеств, 304–6

недопустимость размещения в заголовочном файле, 385

объекта, 382

объектов класса bitset, 169 объектов класса complex, 125

последовательных контейнеров, 256–61 производного класса, 876–78 пространств имен, 406–20

членов, 415–17

сравнение с объявлениями, 381–83

функции и локальная область видимости, 378

как часть шаблона функции, 477 шаблона класса, 791–800

разрешение имен в, 844–46

опции в командной строке, 356–65

отображения, 292–309

map, заголовочный файл, 293 заполнение, 293 невозможность переупорядочения, 587

недопустимость использования итераторов с произвольным доступом, 583

сравнение с множествами, 292

текста заполнение, 292–98

определение, 292–98

отрицатели как адапторы функций, 573

очереди, 315–16

queue, заголовочный файл, 315 size(), 315

top(), функция, 316

очереди с приоритетами, 315, 316 очередь с приоритетами, 315

size(), 315

top(), функция, 316

ошибки

assert(), макрос, 226

бесконечная рекурсия, 351

винструкции if, 193

вциклах, 197

зацикливание, 93 висячие указатели, 389 как избежать, 394

динамического выделения памяти, 395 итератор, использование, 226 компиляции, конфликты в области видимости

using-объявления, 437

массив индекс за концом, 94

области видимости, подводные камни using- директивы, 426

оператор присваивания вместо оператора равенства, 100

порядка вычисления подвыражений, 142 проблема висячего else, 195

проблемы константных ссылок и указателей, 106

проблемы побитовых операторов, 166

С++ для начинающих

проблемы, связанные с глобальными объектами, 349

пропуска

завершающего нуля в C-строке, 402

скобок при освобождении динамически выделенного массива, 402

редактора связей повторные определения, 386

смещения на единицу при доступе к массиву, 31

фазы связывания при наличии объявления в нескольких файлах, 383

Ошибки конкретизации шаблона функции, 484

П

память утечка, 35

параметр(ы)

объявление, сравнение с объявлением исключений, 540

размер, важность для передачи по значению, 327

списки параметров переменной длины, многоточие, 343

различия перегруженных функций, 431 ссылочные, 329–33

влияние на преобразования при разрешении перегрузки функции, 457

преимущества эффективности, 330, 540 ранжирование, 471 сравнение с параметрами-указателями,

333–35

шаблона использование указателей на константы,

101

не являюшиеся типами, 476 являюшиеся типами, проверка, 325–26

параметры функций аргументы по умолчаниюю, 340–43

использования многоточия, 343–44 массивы, 335–39 при разрешении перегруженных функций,

430

проверка типов, 325–26 списки параметров, 325

сравнение параметров указательного и ссылочного типов, 333–35

сравнение с глобальными объектами, 349–50

ссылки, 107, 329–33

использование для возврата нескольких значений, 197

на константы, 331 преимущества в эффективности, 330

сравнение с параметрами-указателями, 333–35

тип возвращаемого значения тип pair, 197

указатели, 329 указатели на функции, 370–73

переменные глобальные параметры и возвращаемые

значения, 349–50

1178

константные, 100 объявление как член пространства имен, 408

переносимость знак остатка, 143

перестановки, обобщенные алгоритмы, 589 перечисления, 110–13

основания для включения в язык, 110

расширение типа при разрешении перегрузки функции, 452

точное соответствие при разрешении перегрузки функции, 445

по умолчанию аргументы, 340–43

и виртуальные функции, 910–13 влияние на выбор устоявших функций, 472 и устоявшие функции, 472–73 конструктор, см. конструктор, 678–79

побитовый(е) оператор И (&), 164

оператор И с присваиванием (&=), 152, 164 оператор ИЛИ (!), 165 оператор ИСКЛЮЧАЮЩЕЕ ИЛИ (^), 165 оператор НЕ (~), 164 оператор сдвига (<<,>>), 165 операторы, 164–66

поддержка в классе bitset, 170

повторное возбуждение исключения, 542–43

позиция разрешение аргумента по позиции в списке,

341

поиск rfind(), 278

подстрок, 280

элементов

множества, 306

отображения текста, 298–99 ПОО (правило одного определения), 382, 416–

18

последовательные контейнеры, 248–319 вставка элементов, 265 критерии выбора, 252 обобщенные алгоритмы, 269–70 определение, 256 перестановка элементов, 269 присваивание, 268 удаление элементов, 267

предостережения использование знакового бита в битовых

векторах, 166

неопределенность порядка вычисления бинарных операторов сравнения, 147

опасности приведения типов, 178

подводные камни using-директивы, 426

возврата l-значение, 348 возврата ссылки на объект, 348 глобальные объекты, 349 приведения типов, 181 шаблона класса auto_ptr, 399

представление влияние на расширение типа перечисления,

452

С++ для начинающих

1179

информация о реализации в заголовочном файле limits, 145

строк, 92 целых чисел, 143

преобразование bool в int, 109

l-значения в r-значение, 446–47 арифметическое, 177–78 бинарного объекта-функции в унарный,

использование адаптора-связывателя, 573

выбор преобразования между типами классов, 764–76

выведение аргументов шаблона функции, 486

как точное соответствие при разрешении перегрузки функции, 459

квалификаторов влияние на последовательность

преобразований, 470

при выведении аргументов шаблона функции, 487

ранжирование при разрешении перегрузки функции, 470

конверторы, 445

конструкторы конструкторы как конверторы, 761–64

множественные, разрешение неоднозначности приведения, 468

недопустимость преобразований между типами указателей на функции, 439

неявные преобразования типов, 176

определенное пользователем, 445

последовательности определенных пользователем

преобразований, 764–67 определенных пользователем,

ранжирование при разрешении перегрузки функций, 771–76 определенных пользователем, с учетом

наследования, 1034–36 стандартных преобразований, 468–72

ранжирование инициализации ссылок при разрешении перегрузки функции, 457

расширения типа, 175 аргументов, 451–53

типа перечисления в арифметические типы, 112

спотерей точности, предупреждение компилятора, 326

стандартное, 453–57 типа аргумента, 444–60

трансформации l-значений, 450 трансформация I-значений

преобразования при выведении аргументов шаблона функции, 486

трансформация I-значения

ранжирование при разрешении перегрузки функции, 468

указателей

в тип void* и обратно, 179 преобразования квалификаторов, 449 стандартные преобразования указателей,

456

трансформации l-значений, массива в указатель, 448

трансформации l-значений, функции в указатель, 448

явные преобразования типов, 144, 175, 178

препроцессор

комментарий парный(/**/), 25

константы

__cplusplus__, 23

макросы шаблоны функций как более безопасная

альтернатива, 474 предкомпилированные заголовочные файлы,

385

приведение(я), 144

const_cast, оператор, опасность применения,, 180

dynamic_cast (), оператор, 1001–7 dynamic_cast()

идентификация класса объекта во время выполнения, 182

reinterpret_cast

опасности, 181 reinterpret_cast, оператор, 181 static_cast

сравнение с неявными преобразованиями, 180

static_cast, оператор, 181

выбор конкретизируемого шаблона функции, 485

для принудительного установления точного соответствия, 450

опасности, 181 сравнение нового синтаксиса со старым, 182 старый синтаксис, 182–83

применение для подавления оптимизации, 127

примеры

класс IntArray, 45

IntSortedArray, производный класс, 54 класс iStack, 183–87

поддержка динамического выделения памяти, 316–17

преобразование в шаблон stack, 318–19

класс String, 128–39

класс связанного списка, 221–47 обработка аргументов в командной строке,

356–57

система текстового поиска

(глава 6), 248–319 функция sort, 365

шаблон класса Array, 55–62, 849–57 SortedArray, производный класс, 993–98

примитивные типы

(глава), 98–139

присваивание векторам, сравнение с встроенными

массивами, 122

и поведение auto_ptr, 397

комплексных чисел, 155 массиву, недопустимость присваивания

другого массива, 115

оператор

и требования к l-значению, 81

перегруженный, 709–12, 733–35

составной, 152

С++ для начинающих

последовательному контейнеру, 268–69 почленное для объектов класса, 709–12 ссылке, 107 указателю на функцию, 367

вопросы, связанные с перегруженностью функции, 439

проверка выхода за границы диапазона, 289

не выолняется для массивов, 116

типа назначение и опасности приведения типов,

182

неявные преобразования, 326 объявления, разнесенного по нескольким

файлам, 384

отмена с помощью многоточия в списке параметров, 343

параметра, 325–27 сохранения в шаблоне функции, 476 указателя, 88

программа, 14–21

производительность auto_ptr, 397

классы, локальность ссылок, 191

компиляции зависимость от размера заголовочного

файла, 385 при конкретизации шаблонов функций,

497

контейнеров емкость, 255

компромиссы при выборе контейнера, 252 сравнение списка и вектора, 254

определения шаблона функции в заголовочном файле, 495

сравнение обработки исключений и вызовов функций, 550

ссылок

объявление исключений в catch- обработчиках, 540

параметры, 330

параметры и типы возвращаемых значений, 389

указателей на функции проигрыш по сравнению с параметрами-

ссылками, 540

проигрыш по сравнению со встроенными функциями, 559

сравнение с объектами-функциями, 567

функций вопросы, связанные с возвращаемыми

значениями, 324

накладные расходы на вызов рекурсивных функций, 351

недостатки, 352 передачи аргументов по значению, 328

преимущества встроенных функций, 133

производные классы деструкторы, 896–99 конструирование, 889–96

почленная инициализация, 925–27 конструкторы, 892–93

определение при виртуальном наследовании, 976–78

1180

при множественном наследовании, 950–55 присваивание почленное, 927–28

пространства имен, 406–20 безымянные, 418–20

инкапсуляция сущностей внутри файлов, 419

отличие от других пространств имен, 419 вложенные, 412–14

и using-объявления, 435

объявления перегруженных функций внутри, 434–38

глобальное, 376

доступ к скрытым членам с помощью оператора разрешения области видимости, 411

проблема загрязнения пространства имен, 406

область видимости, 376 std, 426–28

определения, 408–10 определенные пользователем, 407 псевдонимы, 420–21

члены определения, 416

требование правила одного определения, 416–18

шаблоны функций, 521–24

процедурное программирование

(часть 3), 592–782

псевдоним(ы)

имен типов, typedef, 127

пространства имен, 66, 420–21

Р

равенство оператор(ы), 145–48

потенциальная возможность выхода за границы, 116

разрешение перегрузки функции, 443 (глава), 429–73

выбор преобразования, 767 детальное описание процедуры, 460–73 наилучшая из устоявших функция, 453

для вызовов с аргументами типа класса, 771–76

и перегрузка, 468–72

ранжирование последовательностей определенных

пользователем преобразований, 1034– 36

последовательностей стандартных преобразований, 468–72

устоявшие функции, 465–68 для вызовов операторных функций, 787–

88

для вызовов функций-членов, 779–82

иаргументы по умолчанию, 472–73

инаследование, 1034–36

функции-кандидаты, 461–65 для вызовов в области видимости класса,

770–71

для вызовов операторных функций, 783– 87

С++ для начинающих

для вызовов с аргументами типа класса, 767–70

для вызовов функций-членов, 778 и наследование, 1031–34

явные приведения как указания компилятору, 451

разрешения области видимости оператор (

)

доступ к членам глобальной области видимости, 411

), 410–12

)

доступ к членам вложенного пространства имен, 412–14

Разрешения области видимости оператор (

)

доступ к шаблону функции как члену пространства имен, 524

разыменования оператор (*)

использование с возвращенным типом указателя, 367

как унарный оператор, 141 не требуется для вызова функции, 368

опасности, связанные с указателями, 333 приоритет, 118

ранжирование определений шаблона функции, 505

последовательностей стандартных преобразований, 468–72

рассказ об Алисе Эмме, 250

и реализация класса string, 137 рекурсивные функции, 352

С

С, язык

символьные строки

использование итератора istream_iterator, 579

функции указатели на функции, 373

связыватель как класс адаптора функции, 573

сигнатура, 325 символ(ы)

литералы синтаксис записи, 77

массив символов, инициализация, 114, 115 нулевой, для завершения строкового

литерала, 78

символы & (амперсанд)

оператор взятия адреса использование в определении ссылки,

104 && (двойной амперсанд)

оператор логического И, 146

символы (двойное двоеточие)

оператор разрешения области видимости класса, 42

(двойное двоеточие)

оператор разрешения области видимости, 410–12

1181

-- (двойной минус)

оператор декремента, 153, 740–44 - (минус)

использование для обозначения опций в командной строке, 357

! (восклицательный знак) оператор "логическое НЕ"

вычисление, 147 характеристики и синтаксис, 145

%(процент)

оператор деления по модулю, 142

оператор вычисления остатка, характеристики и синтаксис, 143

%= (процент равно)

оператор вычисления остатка с присваиванием, 152

& (амперсанд)

оператор взятия адреса использование с именем функции, 164 как унарный оператор, 141

оператор побитового И, 164 && (двойной амперсанд)

оператор логического И, 142 &= (амперсанд равно)

оператор побитового И с присваиванием, 164

как оператор составного присваивания, 152

() (круглые скобки)

использование оператора вызова для передачи объекта-функции, 567

оператор вызова, перегрузка в объектах- функциях, 559

(обратная косая черта a) escape-последовательность "звонок", 77

(обратная косая черта n) escape-последовательность "новая строка",

77

(обратная косая черта v) escape-последовательность "вертикальная

табуляция", 77 (обратная косая черта знак вопроса)

escape-последовательность "знак вопроса", 77

(обратная косая черта)

как escape-символ, 280 * (звездочка)

оператор разыменования доступ к объектам с помощью, 89

использование для задания типа возвращаемого значения, 366

как унарный оператор, 141 не требуется для вызова функции, 368

определение указателей с помощью, 87 приоритет, 118

оператор умножения характеристики и синтаксис, 142

*= (звездочка равно)

оператор умножения с присваиванием, 152 , (запятая)

неправильное применение для индексации массива, 117

оператор, 163

. (точка)

С++ для начинающих

1182

оператор "точка", 38

... (многоточие), 343–44

для обозначения универсального catch- обработчика, 544

использование в типах функций, 367 / (косая черта)

оператор деления характеристики и синтаксис, 142

/= (косая черта равно)

оператор деления с присваиванием, 152 ; (точка с запятой)

для завершения инструкций, 188 ?: (знак вопроса двоеточие)

условный оператор, 133, 158 сокращенная запись if-else, 199

[,) (левая квадрнатная, правая круглая скобки)

для обозначения интервала с включенной левой границей, 583

[] (квадратные скобки)

для динамического выделения памяти под массив, 400

для освобождения выделенной под массив памяти, 402

оператор взятия индекса для доступа к вектору, 121

для проверки битов в битовом векторе, 168

инициализация отображения с помощью, 294

не поддерживается для контейнеров multiset и multimap, 312

оператор взятия индекса, 736 оператор индексирования массива,

перегрузка в определении класса массива, 45

\\" (обратная косая черта двойная кавычка) escape-последовательность двойной

кавычки, 77 \\ (двойная обратная косая черта)

escape-последовательность "обратная косая черта", 77

\\t (обратная косая черта t) escape-последовательность

горизонтальнаятабуляция, 77 ^ (крышка)

оператор побитового ИСКЛЮЧАЮЩЕГО ИЛИ, 164

^= (крышка равно)

оператор побитового ИСКЛЮЧАЮЩЕГО ИЛИ с присваиванием, 164 как оператор составного присваивания,

152 __STDC__, 23

_обратная косая черта одиночная кавычка) escape-последовательность "одиночная

кавычка", 77 {} (фигурные скобки)

использование в объявлениях пространств имен, 408

использование в предложении catch, 536

использование в составной директиве связывания, 354

как ограничители составной инструкции, 188

при инициализации вложенного массива, 117

| (вертикальная черта)

оператор побитового ИЛИ, 164

||(двойная вертикальная черта)

оператор логического ИЛИ

характеристики и синтаксис, 145

оператор логического ИЛИ вычисление, 146

|= (вертикальная черта равно)

оператор побитового ИЛИ с присваиванием, 164 как оператор составного присваивания,

152 ~ (тильда)

оператор побитового НЕ, 164 + (плюс)

оператор сложения поддержка в арифметических типах

данных, 30 ++ (двойной плюс)

оператор инкремента, 153, 740–44 += (плюс равно)

оператор сложения с присваиванием, 146 += (плюс равно)оператор сложения с

присваиванием как оператор составного присваивания,

152

<(левая угловая скобка) оператор "меньше"

вопросы поддержки, 566

использование при сортировке по длине, 558

перегруженный оператор в определении контейнера, 259

<< (двойная левая угловая скобка) оператор вывода, 26 оператор сдвига влево, 164

<<=(двойная левая угловая скобка равно) оператор левого сдвига с присваиванием,

152 <> (угловые скобки)

явный шаблон применение в специализациях, 499

спецификации аргументов, 490 -= (минус равно)

оператор вычитания с присваиванием, 152 = (равно)

оператор присваивания, 100, 733–35 и l-значение, 81

использование с объектами классов, 39

использование с псевдонимами пространств имен, 420

== (двойное равно) оператор равенства, 100

поддержка в арифметических типах данных, 30

оператор равенства, необходимость наличия в определении контейнера, 259

-> (минус правая угловая скобка) оператор "стрелка"

С++ для начинающих

перегруженный оператор доступа к членам, 740

>> (двойная правая угловая скобка) оператор ввода, 1051–63

перегрузка. cin. cin оператор сдвига вправо, 164

>>=(двойная правая угловая скобка равно) оператор правого сдвига с присваиванием,

152

символы:, 77 сложения (+) оператор

комплексных чисел, 155 сокрытие информации, 39, 598

вопросы, связанные с вложенными пространствами имен, 414

доступ к закрытым членам класса, 607

имена в локальной области видимости, 378 объявление члена пространства имен, обход с

помощью оператора разрешения области видимости, 411

параметры шаблона, имена в глобальной области видимости, 478

сравнение с перегрузкой, 434 во вложенных областях видимости, 461

члены глобальной области видимости, доступ

с помощью оператора разрешения области видимости, 411

составные выражения, 142 инструкции, 188–89

директивы связывания, 354

присваивания оператор, 152

операторы над комплексными числами, 156

состояния условий

в применении к библиотеке iostream, 1086–88

спецификации явные, аргументов шаблона функции, 490

списки

list, заголовочный файл, 256 merge(), обобщенный алгоритм

специализированная реализация для списка, 588

push_front(), поддержка, 257 size(), 221

влияние размера объекта на производительность, 254

как последовательный контейнер, 256–61

неприменимость итераторов с произвольным доступом, 583

неприменимость обобщенных алгоритмов, требующих произвольного доступа, 588

обобщенные, 241–47

поддержка операций merge() и sort(), 269 сравнение с векторами, 251–52 требования к вставке и доступу, 252

списки параметров переменной длины использование многоточия, 343

сравнения объекты-функции, 571 операторы, 145–48

поддержка в контейнерах, 258

1183

ссылки

для объявления исключения в catch- обработчике, 543

инициализация как преобразование точного соответствия,

457–59

ранжирование при разрешении перегрузки функции, 471–72

ссылки на const, 105–8

использование с sizeof(), 161

как тип возвращаемого значения функции, 348

недопустимость массив ссылок, 115 параметры-ссылки, 107, 329–33

необходимость для перегрузки операторов, 335

преимущества эффективности, 330 парамтеры-ссылки

по сравнению с параметрами-указателями, 333–35

сравнение с указателями, 104

статические объекты объявление локальных объектов как, 390–92

объявление, сравнение с безымянным пространством имен, 419

статические члены класса указатели на, 636–37

статическое выделение памяти, 33 стек, контейнерный тип, 312–15 stack, заголовочный файл, 312

top(), функция, 154, 313

динамическое выделение памяти, 317 операции (таблица), 313

реализация с помощью контейнера deque, 314 стека, пример класса, 183–87, 183–87

строки

append(), 287–88 assign(), 287 compare(), 289 erase(), 267, 285 insert(), 266 replace(), 290–91 swap(), 268, 288

поиск подстроки, 273–79, 285–86, 290

присваивание, 266

Т

тело функции, 321

тип точное соответствие, 445–51

тип(ы)

bool, 108–10 C-строка, 92–95

typedef, синоним типа, 126

арифметические, 30–33

базовые

(глава), 98–139

для определения нескольких объектов одного и того же типа pair, 128

имя класса как, 595

использование с директивой препроцессора include, 68

С++ для начинающих

1184

поверка

недостатки по сравнению со встроенными

назначение и опасности приведения, 182

функциями, 559

проверка

присваивание, 367

неявные преобразования, 326

сравнение с указателями на данные (сноска),

объявления в нескольких файлах, 384

87

подавление, многоточие в списке

указатели на члены, 628–38

параметров функции, 343

указатели на данные-члены, 634

сравнение, функция strcmp(), 133

указатели на статические члены, 636–38

С-строка

указатели на функции-члены, 632

динамическое выделение памяти, 401

умножения оператор (*)

точка конкретизации

поддержка в арифметических типах данных,

шаблона функции, 518

30

точное соответствие, 445–51

унарные операторы, 141

 

условный

У

директивы препроцессора, 21

инструкции

 

угловые скобки (<>)

if, 192–98

шаблон

инструкция

использование для определения, 56

switch, 201–3

спецификации аргументов, 490

оператор (?

явные

)

специализации шаблона, 498

сравнение с функциями, 352

спецификации аргументов шаблона, 490

оператор (?:), 133

указатели, 87–90

сокращение для if-else, 199

sizeof(), использование с, 161

условный оператор

void*, 89

инструкция, 188

преобразование в тип void* и обратно, 179

 

адресация

Ф

C-строк, 92

 

объектов, 89

файл(ы)

объектов класса, использование оператора

ввод/вывод, 28–29

->, 603

входной

элементов массива, 118

открытие, 28

вектор указателей, преимущества, 255

выходной

висячий

открытие, 29

возвращенное значение, указывающее на

несколько

автоматический объект, 389

размещение определения пространства

указывающий на освобожденную память,

имен в, 410

394

сопоставление объявлений в, 383

использование в обобщенных алгоритмах,

объявления локальных сущностей

120

использование безымянного пространства

как значение, возвращаемое функцией, 370

имен, 419

как итераторы для встроенного массива, 264

фигурные скобки ({})

константные указатели, 101

использование в объявлениях пространств

на константные объекты, 101

имен, 408

нулевой указатель, 455

использование в предложении catch, 535

как операнд оператора delete, 394

использование в составной директиве

параметры, 329, 334

связывания, 354

сравнение с параметрами-ссылками, 333–

как ограничители составной инструкции, 188

35

при инициализации вложенного массива, 117

сравнение с массивами, 118–20

функции

сравнение со ссылками, 43, 106

(глава), 320–75

указатели на функции, 365–75

function, заголовочный файл, 568

вызов по, 368–69

try-блок, 536

и спецификации исключений, 548–50

возвращаемые значения, 346–50

инициализация, 367

локальный объект, проблема возвращения

как возвращаемые значения, 370–73

ссылки на, 348

как параметры, 370–73

объект класса, 348–50

массивы, 369–70

объект класса как средство вернуть

на перегруженные функции, 439–40

несколько значений, 350

на функции, объявленные как extern "C",

параметр-ссылка как средство возврата

373–75

дополнительного значения, 329

написанные на других языках, 374

сравнение с глобальными объектами, 349–

 

50

С++ для начинающих

указатель на функцию, 372 вызовы, 322

заключенные в try-блок, 536 недостатки, 352 сравнение с обработкой исключений, 542

иглобальные объекты, 381–87

илокальная область видимости, 378

имя функции

перегрузка, 429 преобразуется в указатель, 367

интерфейс объявление функции как, 323

прототип функции как описание, 323 конверторы, 757–61

конструкторы как, 761–64 локальное хранение, 327

на другом языке, директивы связывания, 353–55

обращение к, 322

объявления как часть шаблона функции, 477

как члена пространства имен, 407 сравнение с определениями, 382

объявления перегруженных функций, 429–32 и область видимости, 434–38 как перегружаются, 429–32

когда не надо перегружать, 432–34 причины для перегрузки функций, 429

оператор вызова функции (()), 736–38 определение, 321

как часть шаблона функции, 477 сравнение с объявлениями, 382

преимущества, 352 преобразование функции в указатель, 448 прототип, 323–27 рекурсивные, 350–52 сигнатура, 325 списки параметров, 325

тип недопустимость возврата из функции, 324

преобразование в указатель на функцию, 347

тип возвращаемого значения, 324–25

недопустимость указания для конструкторов, 671

недостаточен для разрешения перегруженных функций, 431

ссылка, 348 указатель на функцию, 370–73

функции-кандидаты, 442, 460–65 вызов с аргументами типа класса, 767–70

для вызовов в области видимости класса, 770–71

для вызовов функций-членов, 778 для перегруженных операторов, 783–87 для шаблонов функций,, 507 наследование и, 1031–34

функции-члены, 129, 596–98, 604–14

встроенные функции сравнение с не-встроенными, 605–7

вызов, 131 модификация для обработки исключений, 531 независимые от типа, 50 определение, 132

1185

открытые доступ к закрытым членам с помощью, 40

сравнение с закрытыми, 608–10

перегруженные и разрешение, 776–82

объявление, 777–78 проблемы, 434 функции-кандидаты, 778

специальные, 610–11 статические, 626–27 устоявшие, перегрузка и, 779–82

Х

хип, 162, 392, 587

выделение памяти для классов в, 749–51

выделение памяти для массива в, 400 выделение памяти для объекта в, 392

исключение bad_alloc, 393

обобщенные алгоритмы, 587, 1191 См. также обобщенные алгоритмы, 1192

Ц

целые константы, перечисления как средство

группировки, 110 расширение булевских константы до целых,

146

расширение типа, 177 стандартные преобразования, 177

при разрешении перегрузки функции, 453 типы данных, 75

цикл(ы), 20

завершение

break, инструкция, 218 continue, инструкция, 219

инструкции for, 196

while, 213–16

инструкции do-while, 216–17 for, 209–13 while, 21

ошибки программирования, 198 бесконечные циклы, 274

условие останова, 32

Ч

числа с плавающей точкой арифметика, характеристики и смежные

темы, 145 правила преобразования типов, 177

стандартные преобразования при разрешении перегрузки функции, 453

численные обобщенные алгоритмы, 586 numeric, заголовочный файл, 586

читабельность typedef, 126

в объявлениях указателей на функции, 369 как синоним контейнерных типпов, 295

имен параметров, 325 имен перегруженных функций, 432

С++ для начинающих

1186

квалификатор const для объявления констант,

конкретизации, 592–782одели компиляции,

100

494–98

параметров-ссыслок, 335

с включением, 494–95

разделение обработчиков исключений, 534

с разделением, 495–97

рекурсивных функций, 351

определение, 474–82

члены класса

параметры, 475–82

this

для повышения гибкости обобщенных

использование в перегруженном операторе

алгоритмом, 566

присваивания, 710

параметры-константы, 476

когда использовать в функциях-членах,

параметры-типы, 476

619–21

перегрузка, 503–6

указатель this, 616–20

передача объектов-функций шаблону, 569

битовые поля, 643–45

разрешение имен в определениях, 514–20

данные-члены, 594–96

разрешение перегрузки при конкретизации,

защищенные, 871

506–14

изменчивые (mutable), 614–16

тип возвращаемого значения и выведение

статические, 621–25

аргументов шаблона, 491

тип члена, 631–36

точка конкретизации, 518

доступ, 599–600, 607–8

явные

друзья, 599–600

аргументы, 490–93

статические, 621–28

объявления конкретизации, 497–98

функции-члены, 596–98, 604–16

спецаиализации, 498–503

встроенные и не-встроенные, 605–7

 

закрытые и открытые, 608–10

Э

конверторы, 757–61

 

перегруженные, объявления, 776–78

эффективность

специальные функции-члены, 610–11

сравнение с гибкостью при выделении

спецификации исключений для, 1021–24

памяти, 33

статические, 626–28

 

тип члена, 631–33

Я

члены-классы

 

открытые и закрытые, 598–99

явное

шаблоны, 826–31

преобразование, 178–82

Ш

преобразование типа, 144, 175

 

шаблон класса Array

 

Array_RC, производный класс, 990–92

 

шаблоны классов

 

(глава), 791–857

 

вложенные типы, 824–26

 

и пространства имен, 846–48

 

модели компиляции, 831–38

 

с включением, 833

 

с разделением, 834–37

 

объявления друзей в, 815–21

 

определения, 791–800

 

разрешение имен в, 844–46

 

параметры, 794–97, 805–11

 

параметры-константы, 805–11

 

параметры-типы, 800–805

 

статические члены классов, 821–24

 

точка конкретизации, для функций-членов,

 

846

 

частичные специализации, 842–44

 

члены

 

функций, 811–15

 

явные

 

объявления конкретизации, 837–38

 

специализации, 838–42

 

шаблоны функций

 

(глава), 592–782

 

и пространства имен, 521–24