Вы находитесь на странице: 1из 170

С++

под РУJСОЙ.

The С++ Programmer's HandBook Paul J. Lucas АТ&Т Bell Lahoratories Prentice Hall, Englewood Cliffs, N

The

С++

Programmer's

HandBook

Paul J. Lucas

АТ&Т

Bell Lahoratories

HandBook Paul J. Lucas АТ&Т Bell Lahoratories Prentice Hall, Englewood Cliffs, N ew Jersey 07632

Prentice Hall, Englewood

Cliffs, New Jersey 07632

С++ под рукои

v

Пол Лукас

Перевод с английского

К. В.

Сулема

Под редакцией С. Н. Сущенко

К. В. Сулема Под редакцией С. Н. Сущенко Киев НИПФ «диаСОФТ» 1 993

Киев НИПФ «диаСОФТ» 1 993

ББК 32. 97� С 45

Лу:к:асп.

ББК 32. 97� С 45 Лу:к:асп. С 45 С++ под рукой: Пер. с англ. - Киев:

С 45

С++ под рукой: Пер. с англ. - Киев: «диаСофтJ., 1 993. - 176 с., ил.

ISBN 5-87 458-21 3-8

Книга американского специалиста предстаВJIЯет собой удобный спра­

вочник, позволяющий быстро найти нужную информацию по

С++,

пре­

процессору, а также по библиотеке ввода/вывода и другим библиотекам.В

книrе не описана какая-либо конкретная версия компилятора С++. Здесь дан стандарт языка С++ фирмы АТ&Т, в которой этот язык и был разра­ ботан Бьярном Страустрапом. Этот стандарт был реализован фирмой Borland в компиляторе Borland С++ версий 3.0 и 3. 1 . Книга содержит большое количество примеров, которые служат хоро­ шей иллюстрацией к использованию средств языка. Во мноrих случаях делается сравнение конструкций С++ с соответствующими конструкция­ ми С, при необходимости указываются различия между этими языками. Книга рассчитана на программистов разной квалификации, использу­ ющих язык С++.

ББК 32.973

ISBN 0- 1 3- 1 1 823 3- 1

(англ.)

© 1 992 Ьу АТ& Т

 

PuЬlished Ьу Prentice-Нall, lnc. А Simon & Schuster Company Englewood Cliffs, New Jersey 07632

ISBN 5-87458-21 3-8

(русск.)

©НИПФ«диаСофтJ., 1 993,

перевод на русский язык, предисовие к русскому изданию, обработка и оформление

Пред и сло в ие перев одчика

Предлагаемая вашему вниманию книга является кратким справочником по одному из наиболее популярных сейчас языков программирования С++. Этот справочник рассчи­ тан в первую очередь на программистов, хорошо знающих С++, однако с равНЬIМ успехом его могут использовать и новички. Кроме того, справочник может быть полезен и для разработчиков, использующих С и желающих перейти на С++.

Каждая синтаксическая конструкция, описываемая в кни­ ге, сопровождается примерами, поясняющими ее семанти­ ку. Примеры подобраны таким образом, что служат хорошей иллюстрацией к использованию средств языка. Во мноmх случаях делается сравнение конструкций С++ с соответствующими конструкциями С, при необходимости указываются различия между этими языками.

Особенностью этой книm является то, что она не описыва­ ет какую-либо конкретную версию компилятора С++. Здесь дан стандарт языка С++ фирмы АТ&Т, в которой этот язык и был разработан Бьярном Страустрапом. Следует отметить, что этот стандарт был реализован фирмой Вorland в компиляторе Вorland С++ версий 3.0 и 3.1.

Немн о г о об авторе. Пол Дж. Лукас является членом Тех­ нического Совета в Intemational Switching Systems Division компании АТ&Т Bell LaЬoratories в Нейпервилле, штат Иллинойс. Кроме того, он проводил бета-тестирование С++ версии 3.0. Его профессиональные интересы охватывают области, связанные с языками программирования, компи­ ляторами, разрабо:rкой пользовательских интерфейсов и

б

С++ под рук:ой

ивтеJIJi ектуальНЬiх инструментал ьных систем, облегчаю­ щих жизнь программисту.

Хочу выразить благодарность сотрудникам фирмы «диа­ СОФТ» Игорю Хижняку и Юрию Артеменко за помощ ь, :жазанную при подго товке этого перевода.

Желаю больш их успехов в творчест ве!

К. Су ле.м. а Киев, фupJrta «Ди а Софт»

24 JШJl 1993 г.

Пред и сл ов ие

Эта книга была задумана как удоб ный спра вочник, позво­ ляющий быстро найти нужную информацию по С++ , пре­ процессору, а также по библ иотеке ввода/вывода и друmм библиотекам. С правочник может быть полезен как для нович ков , так и для опытных прогр ам мистов.

Для программи ста на С++ эта книга должна стать друrом, который сидит рядом с компьютером или терминалом, по­

мога.я найти нужную информацию и не перелопа чива.я при

этом длинные

параг раф ы.

Вся информация в книге имеет следующее представл ение:

11 Заголовок

·

представл ение: 11 Заголовок · • Начинает новый предмет. •

Начинает новый предмет.

Может использовать многоточие ("

") для формирова­

ния предложений, окончан иями которых .я вляются пун­

кты списка , следую щего з а заголовком (таким же образом, как и в этом примере).

Заголовок

Начинает новую тему в текущ ем предмете.

Также может использовать мн оготочие для формирова­

предложений, окончаниями кот орых .я вляются пун­

н ия

кты списка, следующего за заголовком.

Эта книга не .я вля ется учебником по прог раммированию на С++ , од нако в ней представлена техника использования опред ел енных возмо:ж�остей .языка, а также различные

8

С++ под р у кой

тонкости их взаимоо тношений.

Б лагода рности

Блаrодарю Б ьярна Страустрапа за предоставление нам С++ , а также за ответы на наши вопрос ы. Блаrодарю Д жи­ ма Коплайна, Брэда Ю хаса, Дэвиса Мэнкла, У оррена Монтrомери, Грифф а Смита, а также "посторонних на­ блюдателей" за их ком ентарии к черновому варианту этой

книги. Блаrодарю

Ва лери Монро, которая выполняла для

меня бета-тестирование и предоставила мне предваритель­ ную копию С++ верс ии 3.0 для тестирования моих приме­ ров для этой верс ии. Блаrодарю также Морриса Болски за ero ориm нальны:й "С правочник прог раммиста на С" , кото­ рый явился отправной точкой для этой книm .

Н е й п ер виль, ш тат И ЛJШнойс

Библиог ра фия

Пол Дж . Лукас

А Т&Т Unix Syst em LaЬ ora tor ies : Unix System V-USL С++

Language System: Product Reference Manual, Release Notes and Seleced Readings, r eleases 2.0-3.0 beta, U nix

Press, 1 989- 1 991.

Morr is 1. Bolsk y: The С Programmer' s Н andЬook, P rentice Hall , N ew J er s ey , 1 9 85.

Marg ar et А. Ellis and.Bj ar ne

Straus trup : The Annotated С++

Reference

Мanual,

A ddis on-Wesl ey ,

Reading ,

Massac hus etts , 1 989; second edi tion 1991.

Bj ar n e Straus tr up :

The

С++ Programm ing Language,

Ad dison -Wesl ey, Re ading , Mass ac hus etts , 1 986; second

edition 1 991.

Bj ame Straus tr up : Parametrized Types for С++ , Journal of

Пред исловие

9

Object Oriented Progr ammi ng , Ja n./Fe b. 1 9 88.

Язык С ++

Я зьис программирования С++ базируется на своем пре­

дке - языке

С.

Хотя большая часть "подмножества С" в

С++

не изменена,

имеются некоторые отличия. Кроме

тоrо, с

момента появления первой верс ии, С++ подвергся

определенным изменениям. И те и другие отличия ука­ заны: в примечаниях.

1 Комментарии

Начинаются значком 1•, заканчиваются значком 1. Эти комментарии не могут быть вложенными.

Начинаются значком 11, заканчиваются символом но- вой строки . Код содержащий эти комментарии может бЬIТЪ закомментиров ан при помощи 1• и 1.

/* Это один большой комментарий.

for( 1 =О; 1 < 1 0; ++1 а[ 1] =О; */

) / / И ни циал изировать вектор

*/ ) / / И ни циал изировать вектор • Допускают любое число проб

Допускают любое число проб елов.

1 Идентификаторы

Представл я ют соб ой посл едовательность букв , подчер­ киваний или цифр, начинающуюся с буквы: или подчер-

Запрещаете!! испОJiьзовать комментарии 11 в строках препроцессора (см. "Комментарии" в разделе "Препроцессор") .

Язык: С++

11

••

:кивания

.

1, word_count. pl2

Различают регистр. то есть foo - это не то же самое. что Foo.

Могут иметь произвольную длину

••

.

1 Ключевые сло ва

Зарезервированы язы:к:ом (выделены :ключевые слова. появивmиеся в С++) :

слова. появивmиеся в С++) : a s m a u t o b reak case catch

asm

auto

break

case

catch

char

class

const

continue

default

delete

do

douЬle

else

enum

extem

float

for

friend

goto

if

inllne

int

long

new

operator

overload

private

protected

puЬiic

register

retum

short

signed

sizeof

static

struct

switch

template

this

throw

try

typedef

union

unsigned

virtual

void

volatile

while

Ключевые слова catc h. throw и try используются для обработки ис:к:лю чительны х ситуаций. :которая пока в С++ не реализована.

Первые версии С++ используют :клю чевое слово overload. которое пе рестало быть необходимым. Кро ме тоrо. в этих версиях не реализованы :ключевые слова asm. private.

protected. signed, template и volat ile.

Не н ачи н ай те свои иде нт ификат о ры с подчеркива н ия ИJ двойного п од- чер кивании (_). Такие идент ифика т о р ы ко мп иmrтор С++исnользует ДЛ11

своих нужд.

Однако, некоторые реализации имеют огр а ничении.

12

С++ под рукой

В некоторых реализациях зарезервированы также клю­ чевые слова fortran и pascal.

Ключевое слово asm не рассматривается в этом справоч- 11ике по причине специфической реализации.

1

Константы

Целые знаковые константы

Десятичные: Это необязательный знак, за которым сле­ дует иенулевая цифра, з а Это необязательный знак, за которым сле­ дует иенулевая цифра, за которой, в свою очередь, сле­ дует произвольвое число цифр.

2 3, -42, +1 991 11 + допустим, но необязателен

Имеют тип int, если значение константы не превышает максимального допустимого значения для числа типа iпt н:а данной машине, в противном случае имеет тип long.

Целые беззнаковые константы

Это неотрицательные целые или длинные целые к он­ станты.

Десятичные: Это целые или длинные целые к о нстанты без знака с добавленной в Это целые или длинные целые ко нстанты без знака с добавленной в конце буквой U или u.

2 3U, 42u, 1 99 1 UL

Восьмиричные: Это ноль, за которым следует произволь­ вое количество цифр в диапазоне от О до 7.

027. 052, 0 3707

Шестнадцатиричные: Это Ох или ОХ , за которым следует произвольвое количество цифр или букв в диапазоне от

Язык С++

13

а до f или от А до F.

Ох1 7, Ох2а, ОХ7С7

Имеют тип unsigned int, если значение константы: не превы:шает максимальною допустимою значения для числа типа unsigned int на данной машине, в противном случае имеют тип unsigned 1ong.

Д линные целые константы

Это знаковые или безнаковые целые константы:, которые имеют большие значения, нежели это допустимо для чисел типа int.

Явно обозначаются добавлением символа L или 1 к зна­ ковой или беззнаковой целой константе.

2 3L, Ox2al, 1 99 1 ul

К онстанты с n11 ава ющ ей точкой

Имеет целую часть, десятичную точку, дробную часть, символ е или Е и экспоненту со знаком или без неrо.

со з н а к о м или без неrо. • Могут не иметь целой или

Могут не

иметь целой

или дробной

части,

а

та.к:же

не

иметь десятичной точки или экспоненты:.

3. 14159, ЗЕВ, 1 . , .2, 1 .602е-19

Имеют тип douЬle, за исключением случаев, .когда окан­ чиваются символом F или f (тип float) или символом l. или 1 (тип 1ong douЬle) .

23F, 42f, 1 991 F 3. 1 4 1 59 L, ЗЕВL, 1 . 602е-1 91

11 f loat 11 long douЫe

14

С++ под рукой

Симво ль ные константы

Чаще всеrо представляют собой отдельный

символ , за­

IUIЮченный в одиночные кавычки. Имеют тип char•.

'm'. '7\ '+'

Имеют числовые значение, которые равны значениям машинных кодов соответствующих символов.

'А' в кодировке ASCII имеет значение 6�.

Используют уп равляющие последоват ельнос ти для

представления определенных символов:

Ноль

NUL

Тревога (звонок)

BEL

Новая строка

NL (LF)

Горизонтальная табуляция

Вертикальная табуляция Забой Возврат каретки Проrон формата Обратная косая Ьдиночная кавычка Битовая маска Битовая маска

••

нт

VT

BS

CR

FF

\

Oddd

Oxddd

'\

а '

'\ n '

'\t'

'\

Ь '

'\ r ' '\ f '

'\\'

'\"

v '

'\

'\

'

0

'\ ddd '

'\

xddd'

Могут также предстамять собой множество симво.rrов, заключенное в одиночные кавычки. В этом случае имеют тип int, но фактическое значение зависит от ре ализациИ.

'ah' , 'M PNT'

* В С символьные константы имеют тип int. Допускаются битовые маски, которые могут быть заданы последова- тельностью шестнадцатиричных или воемкричных цифр, содержащей от одной до трех таких цифр.

Язык С++

15

/0.

С т роковые константы

Это ноль и более символов, окруженных двойными ка­ вычками.

"m"

,

"С++"

,

"No way, Jose!"

Имеют тип stat ic cha r , то есть это статический вектор символов.

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

charflveD = " Five"; 11 five содержит 5 элементов

содержит 5 э л е м е н т о в • И с пол ь

Используют \" для включения кавычек в строку.

Могут быть з аписаны в неск ольких строках. Послед ним символом в переносимой строке должен быть символ \ . При этом символы \ и новой строки отбрасываются.

char

*q uote ""' " / "Diplomacy/" ls lettlng them 1

have lt your way. "

Соединяются, если являются смежными .

11 Ниже приведены две оди на ковые строки

gr eetlng1 = " Hello world!":

greeti ng2 = " Hello " "world!":

Пе р ечислимые к онста нты

Это идентификаторы.

а нты • Э то идентификаторы. • Э т а воз м о ж ность

Э та воз мо ж ность доступна при испо л ьзовании препроц сс сора.

16

С++ под рукой

Это единственный интегральный тип ния" в разделе "Объявления").

1 Выражения

(см. "Перечисле-

Это сочетание одной или более констант, переменных, или вызовов функций и нуля или более операций.

1 =О, С++, с= sqn( а*а + Ь*Ь )

� 1 =О, С++, с= sqn( а*а + Ь*Ь ) • Рассматриваются как true, если

Рассматриваются как true, если результат их вычисле­ ния не равен нулю, и.ци как false, если результат равен нулю.

1 Опе ра ции

При описании операций будут использовться

сокращения:

следующие

е

v

а

р

s

т

f

Произвольное выражение.

Любое выражение, которое может прини­ мать значение. Целое или символ.

Арифметическое (целое, символ или с плва­ ющей точкой) .

Указатель.

Структура, обьединение или класс.

Член структуры, Qбъединения или класса .

Функция.

Эти сокращения могут комбинироваться. Например, ie - это выражение целого тиnа.

В С считается, что перечисле11ия имеют тип int.

Язык С++

17

Арифметические опера ции

ае +а е pe+ie ае -ае ре -ie ре - ре

-ае

ае•ае

ае /ае

ie%ie

Сумма. Ад рес ре +ie• sizeof ( • ре ) Ра з ность. Адрес ре - ie• sizeof ( •ре ) . Число элементов •• вектора, которые имеют тип•ре . Минусае. Произведение. Частное. Остаток от деления

•••

.

.

Логи ческие операции

Отрицание.

el

11 е2

Или. е2 вычисляется только, если el имеет

el &&е2

значение false. И. е2 вычисляется только, если el имеет значение true.

lf( р && l*p ) 11 есл и р = О, то l*p не вычисляется

= 1 ;

Опера ции отношени я

Выбирают •••• одно из арифметических или адресных выра­ жений

или адресных выра­ жений • • Е с л и ре указывает,

Если ре указывает, скажем, на массив douЬle, то ре + 1 указывает на следующий элемент этого массива, а не на сл�ющий байт в пам!IТИ. Это имеет смысл только, если оба указателя указываюr на один и тот же вектор. Результат имеет тип ptrdiff_t, который определен в файле <stddef.h >.

Знак результата не определен, если один из операндов или оба операн- да имеют отрицательное значение.

Для адресных выражений операции<,<-, > и>- имеют смысл только, если оба выражении указывают на один и тот же вектор.

18

С++ под рукой

18 С++ под рукой

Равно.

!

Не равно.

<

Меньше.

<•

Меньше или равно.

>

Больше.

>-

Больше или равно.

lnllne lnt lnrange( lnt n, lnt lawer, lnt upper)

{

return lawer <= n && n <= upper;

}

Операции пр исваива

v е

Присваивает vзначение е.

.

Допускают множественное присваивание, выnолняемое в одной операции. При этом присваивания: выполняются справа налево.

а =

Ь

=

с

= О; 11 а =(Ь = (с = О));

Могут сочетаться с арифметическими или битовыми ло­ mческими операция:ми. Например,

v операция е

SIВляется сокращенной записью

v= vоперация (е )

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

Язык С++

19

Операции инкремента и декремента

v++i Увеличить на iv 1; результатом выражения яВJI.Яется значение ivдо увеличения. ++i Увеличить на iv 1; результатом выражения является значение iv после увеличения.

pv++ Увеличить на pv на значение sizeof( •pv ) ; результатом выражения ЯВJI.Яется значение pvдо увеличения.

++pv

Увеличить на pv на

значение

sizeof( •pv );

результатом выражения является значение

pv

после увеличения.

Имеет ту :же семантику, что и ++ но вызы­

вает уменьшение на 1.

lnt 1 = 3, J, k;

J

= 1++;

11 1 = 4, J

= 3

k

= -j;

11 J = 2, k = 2

char bu1{3), = buf;

*р++ = 'а';

*++р = ' с ' ;

11 bu1{0] = ' а ' , р = &bu1{1]

11

р

= &bu1{2), bu1{2]

=

'

с

'

Операции

указателей

и массивов

Оп ер ации указателей и массивов Адресv. Содержимое переменной,

Адресv.

Содержимое переменной,

адресуемой

по­

средством ре.

Функция, адресуемая посредством

ре (см.

" Вызов" в разделе " Функция" ).

ре[ ie]

Доступ к элементу ie в массиве ре. Это со­ кращенная запись для • (ре+ ie).

20

С++ под рукой

20 С++ под рукой

sv.•тtp

11 Эти две функц�и функиональна эквивалентны vol d VecCopy( char to[ ] , const char from[ ])

{

 

for( l nt 1 =

О;

to[ 1 ] = from[ 1 ]; ++1 );

}

11 Эта фун кция , однако, имеет более краткую запись

vold

PtrCopy( char * to, char * from )

{

whlle{ *to++

=

*from++ ):

}

Операции структуры и класса

, объединени я

sv.т

Поле структуры, обьединения или класса.

sре->т

Сокращенная

записьдля <*sре).т.

sv.тf

Функция

-

член структуры, объединения

или класса.

spe->тf

Сокращенная

записьдля (*spe).тf.

sv.*тp

Поле структуры, объединения или класса.

sре->*тр

Сокращенная запись для

(*spe).

тр.

Функция -

член структуры,

объединения

spe->*тfp

или класса. Сокращенная запись

для <*spe). *тfр .

s::т

Определяет т или т/ как член структуры ,

или

s::m/

объединения или класса.

struct Polnt

Polnt а, Ь, *рЬ

а.х

{

l nt х, у; } ;

&Ь;

=

=

а.у

=

рЬ->х

=

рЬ->у = 1 ;

l nt Polnt::*coord = &Pol nt::x;

Язык С++

21

a.*coord = pb->*coord = 2;

11 а .х = Ь.х =2

Побитов ые операции

-ie

Дополнение до единицы.

iel

« ie2_

Сдвигie1 влево наie2 бит. В освобождающи­ еся биты записываются нули.

iel

« ie2

Сдвигiel влево наie2 бит. В освобождающи­

iel &ie2

еся биты записываются нули, еслиiel имеет беззнаковый тип, либо неопределенное зна­ чение, еслиiel имеет знаковый тип. Побитовое И.

iel

1 ie2

Побитовое ИЛИ.

iel "ie2

Побитовое исключающее ИЛИ.

char letterA = 'А'; char letterB = 'Ь';

11 Двоичное: 01000001 11 01100010

const char mask = Ох 20; 11 00100000

char lower = letterA 1 Ох 20;

11 01100001

char

u pper = letterB 1 ""Ох 20;

11 01000010

Прочие опера ции

el ? е2 : еЗ Если выполняется условие el , то вычисля­ ется е2, и результатом операции является е2. В противном случае вычисляется еЗ, и результатом операции является еЗ.

lnline i nt Мах( i nt а, i nt Ь) { retu rn а > Ь ? а : Ь; }

el , е2

Вычисляется el, затем е2. Результатом опе­ рации является е2.

void Reverse( i nt а[], i nt n )

r

22

С++ под рукой

for( lnt 1 = О, j = n-1 :

{

 

lnt t = а[

1 ]:

а[

1] =

а[ J ]:

а[ j] = t:

 

}

}

i < n:

++1, --j )

::v

Доступ к глобальной переменной v.

к глобальной переменной v. lnt count: // vold f() { i nt cou nt = :

lnt count:

//

vold f()

{

i nt cou nt = : :cou nt:

}

//

11 Глобальная переменная

/ / Установить локальную в 11 глобальную

sizeofе Число байтов байтов для типа выраж:е- ния е . sizeof( type ) Число байтов байтов для типа type.

char buf[ 1 00 ]:

whlle( cin.getllne( buf, slzeof buf - 1 ) ) cout « buf:

fe(е, е ,

( type )е

) Вызывает функцию с аргументами (см. "Вызов" в разделе "Функции") .

е преобразуется к типу type

Значение

••

к типу type • Значение •• • Выражение, со д ержащее

Выражение, со д ержащее операцию sizeof может быть вычислено на эта- пе компиляции. На жарrоне С и С++ эта операция называется "приведение типа" или просто "приведение".

Язык С++

23

type ( е )

Значение е преобразуется к типу type

char с, *ер = &с; long cheat = ( long ) ер;

11 Получить машинный адрес

Опе р ации р аспр еделения памяти (только в С ++ )

пеw type

пеw type [ ie ]

del

del

]ре

СТВо для типа type и

возвращает адрес

того, вызывается конструктор. При от­ сутствии достаточного объе ма памяти возвращает ноль. Выделяет пространство для массива из ie элементов типа type и возвращает адрес.

Выделяет nрост

. Для классов, кро ме

РЧ,IJ

Для классов конструктор вызываетси дли к аждого эл емента.

которую указн­

вает ре

структор. Если ре и меет н улевое значение, то операция del не выпол­ няет никаких действий.

массивом,

Освобо ает память, на

. Для классов вызываетси де­

Освобождает память занятvю

•••
•••

ре

на который указывает

Дли клас-

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

*Это альтернативная запись nриведения тиnа, которая введена в С++. Однако, она может исnользоваться лишь для ··простых" типов, то есть для тиnов, которые не являются указателями • или ссылками&. Наприм ер, douЬ\e ( х ) може т быть исnользовано для преобразования х в тип double, а int ( р ) не может быть использовано для nреобразования р в указатель на int; вместо этого нужно использовать ( int • )р. ••соответствует функции mallocO в с. •••Соответствует функ ции malloc() в С.

было указывать

••••в nервых версиях С++ число элементов массива.

между с к обками необходимо

С++ ч и с л о элементов массива. между с к обками необходимо

24

С++ под рукой

элемента массива.

Существует глобальная переменная _new_handler, кото­ рая является указателем на функцию, не примимающую аргументов и возвращающую тип void. Как и все глобаль­ ные переменные, она инициализируется нулем.

Всякий раз, когда операция new не может выделить па­ мять , она пров еряет _new_handler. Если з начение _new_handler равно нулю, то возвращается ноль, в против­ ном случае вызывается функция , на которую указывает _new_handler.

Обычно _new_handler указыве;tет на функцию, которая со­ общает пользователю о нехватке памяти и выполняет очи­ стку (например, сохраняет файл на диск) . Это позволяет не производить дополнителкую проверку значения, воз­ вращаемого операцией new.

vold MyNewHandlerO

{

 

cerr « "Out of memory, sorry

/n";

11

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

exlt( 1 );

11 Ненулевой код возврата * .

}

_new_handler = &MyNewHandler;

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

В таблице, приводимой ниже, операции расположены в порядке убывания приоритета. Операции с одинаковым приоритетом объединены в группы. Операции, выделен­ ные курсивом, являются правоассоциируемыми, осталь-

см. "exitO" в пункте "stdlib.h" раздела "Другие библиотеки".

2S

Язык С++

ные - левоассоциируемыми.

С ++ ные - левоассоциируемыми. Доступ к г .лобал ьной переменной

Доступ к г .лобал ьной переменной

Обозначение члена структуры

о Вызов функции

[] Индексация

. ->

Выбор элемента

sizeof

 

Р азмер Л огическое Н Е

-+

Дополнение до е д иницы Унарный мин у с , унарны й пл юс

++--

И нкремент , декремент

&•

Выч исление а д реса, с нятие сс ЫЛIС и

о П риве де ние т ипа new delete Выделение, освобождение .• -> *
о
П риве де ние
т ипа
new delete
Выделение, освобождение
.• -> *
Выбор nоля через указатель
* /%
+ -
<< >>
< <=
Умножение, деление, модуль (остаток)
Сложен ие, вычитание
Левый сдвиг, правый сдвиг
Меньше, меньше или равно

>>- Больше, больше или равно

=-!==

Равно, не равно

&

Побитовое И

л Побитовое исключающее ИЛИ

 

Побитовое ИЛИ

&&

Логическое И

11

Логическое ИЛИ

? :

А ри ф метичес к ое если

ИЛИ ? : А ри ф метичес к ое если * =1 - %= += -

* =1 - %= += -= < <= >>=

&=Л: 1=

П рисва ивание

Запятая

26

С++ под рукой

Порядок вычислений

ГлавНЬiм образом языком не определен.

n = ( а = х++ ) * ( Ь = х++ );

Пусть х имеет значение 1. Если операнды операции

вычисля ются слева направо, то а будет равно 1, а Ь

Если операция является правоассоциативной, то Ь бу­

дет равно 1, а а - 1 .

- 2.

Всегда имеет место левоассоциативность для четырех операций: &&, 11, ?: и, (запятая) .

А рифметические преобраэования

Если один из операндов имеет тип long douЬle, douЬle или float, то друmе операнды преобразуются к одному и тому :же тип,у, причем 1ong douЬle имеет максимальный при­ оритет .

Иначе, если значения типа char, unsigned char, short int, unsigned short int или enum могут быть представлеНЬI типом int, то все операнды указанНЬiх типов преобразу­ ются в int, иначе в unsigned int .

••

Затем, если один из операндов имеет тип unsigned long, то остальные преобразуются в unsigned long.

Иначе, если один операнд имее тип long int, а остальные - unsigned int , и long int может представпять все значения unsigned int, то unsigned int преобразуется в long int, иначе оба операнда преобразуются в тип unsigned long

в С все типы float автоматически поддерживают тип douьte, в С++ это правило больше не выполняется. в С .все знаковые операнды иреобразуются в int, а беззнаковые в unsigned int.

Язык С++

27

 

*

 

int

.

Иначе, если один из оnерандов long или int, то остальные преобразуются к тому же типу, причем long и меет мак­ симальный приоритет.

Иначе, оба операнда имеют тиn int.

i

Операторы

Оператор выражения

Представляет собой выражение, заканчивающееся точ­ кой с запятой (;) .

lang uage =С++:

Оператор метки

Это оператор выражения, п еред которым стоит иденти­ фикатор и точка с заnятой .

Может быть использ ован в операторе goto (см. "goto") .

OUTTA_H ERE: retu rn res u lt:

Пустой

Это просто точка с запятой.

Используется, когда после метки или операторов while, do или for не должно следовать никакого оператора.

*В С все операнды преобразуются в unsigned long int.

** Идентификатор метки отличается от всех остальных идентификаторов тем·, что его область действия ограничивается функцией, в которой он используется.

28

С++ под ру кой

whlle( *р++ = *q++ );

Составной оператор

Представляет собой ноль или более операторов, заклю­

·ченны:х в фигурные скобки.

Допустим везде, где допустим оператор выражения.

Определяет новую область действия, то есть перемен­

ны:е, определенные внутри составного оператора, явля­

ются локальными

в

нем

и скрывают внешние

переменны:е с теми :же именами.

{ lnt t = а; а = Ь; Ь = t; }

Имеет конструктор для локальных переменны:х класса,

(см. "Деструк­

который вызывается при выходе из блока торы:" в разделе "Классы:").

Оператор объявлен ия

••

Описывает идентификатор и его тип ния") .

(см. "Объявле-

break;

Преры:вает выполнение последнего открытого оператора while, do, for или switch.

Выполнение передается на оператор, следующий за пре­ рваны:м.

Кроме того, деструктор вызывается при выполнении операторов goto, break, continue и return.

В С все объявления должны предшествовать всем операторам выраже- ний, в С++ это ограничение снято.

Яз ы,к С++

29

for(

)

for( l nt 1 =

О;

1 <

1 О; ++1 )

lf( g uess = а[ 1 ] )

{

cout « "Congratulatlons!/n"; break; 11 П реры вает for

}

lf( 1 = 1 О)

11 Уп равление передается сюда

cout « " Sorry

/n";

continue;

Передает управление на начало последнеrо открытоrо оператора while, do или for. Эквивалентно оператору goto Ьottom, показанному ниже:

whlle(

{

)

11

goto bonom;

11

bonom : ;

}

do

{

11

goto bonom;

11

bonom: ;

}

whlle(

);

{

30

С++ под рухой

30 С++ под рухой

goto bottom;

11 ·�

bottom:;

}

for( lnt 1 = О; 1 < 1 О; ++1 )

} � for( lnt 1 = О ; 1 < 1 О ; ++1 ) {

{

 

lf( а[ 1 ] === О )

contlnue;// Ничего не делать иначе

11

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

}

return выражение;

Прерывает выполнение текущей функции и возвращает значение выражения вызвавшей функции. Выражение опуасается, если функцияимееттип возвращаемоrо зна­ ченияvоid.

Прообразует тип выражения к типу возвращаемоrо фун­ кцией значения, если это необходимо.

goto метка;

Передает управление оператору, помеченному J.tem к o й . (Memm должна находится внутри текущей функции)

goto FAIL;

Не может вызывать передачу управления

на оператор

обьявления с инициализацией, который расположен в

том же блоке.

Не может передавать управление в составной оператор, расположенны:й после оператора обьявления с

Язьuс: С -++

Язьuс: С -++ 31

31

инициализацией

.

Может

передавать управление

оператора.

за пределы

составноrо

vold ContrlvedO

{

goto L1:

l nt а = О:

// ошибка

//

нельзя делать переход за этот

11 оператор

L1:

goto

L2;

//

п равильно

lnt Ь;

//

нет

инициализации

L2:

goto LЗ:

goto

L4

// Правильно. но сомнительно // ошибка

for(::)

{

lnt c:

но сомнительно // ошибка for(::) { lnt c: LЗ: l nt d = О; // нел

LЗ:

l nt d = О; //

нел ьзя делать переход за этот

11 оператор

L4:

goto LS:

}

L5:

// Можно покидать составной оператор

}

if( вы раж е н ие ) опе ра тор 1

else оп ератор 2

Вычисляет выражение и, если оно имеет неиулевой ре­ зультат (true), выполняется onepamopl, в противlfОМ

выполняется onepamopl, в противlfОМ • Однако э т о д о пу сти

32

С++ под рукой

случае - onepamop2

Конструкция else и onepamop2 могут быть опущены.

Оператор switch

switch( выражение) 11 nервая форма (редкая)

case

case константное-выражение2:

константное-выражение 1:

оnератор switch( выражение) 11 вторая форма бщая)

{

 

case

константное-выражение 1:

case константное-выражение2:

оnераторы case константное-выражениеЗ:

case константное-выражение4:

оnераторы

default:

оnераторы

}

Первая форма оператора switch (используемая редко) эквивалентна записи

if( вы ражение ==

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

выражение == константное-вы ражен ие2

оператор

11

)

пера то р не может быть оператоJЮм обьявления, хотя допустимо ис­ пользование составных оператОJЮВ, которые содержат операторы обьяв­ ления.

Язы к С++

33

за

исключением того, что выражение вычисляется

только один раз.

switch( n) case 2: case 4: case 6: case 8:

appreciate = n;

Во второй форме вычисляется выражение и выполняется набор операторов, которые следуют за соответствую­

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

щим константны.м-выражение.м. В

выполняются операторы, которые следуют за default .

Заметьте, ч.то выполнение оператора switch не заканчи­ вается в конце пункта case, что позволяет выполнять множественные пункты case. В большинстве случаев для прерывания выполнения оператора switch используется оператор break.

switch( с)

{

case '+':

ca se '-':

case '*':

case '/':

default:

n

+Ь;

b reak;

n

=а- Ь;

break;

n

= а *

Ь;

break;

n =а 1 Ь;

b reak;

E rro r( " B ad operato r: " , с);

}

11

Сюда будет пе реда но уп равление после

11

вы пол нения любоrо из операторов b reak

Не допускается совпадение

константных-выражений

Пункт default яв.ляется необязательным, кроме того, он не обязательно должен быть последним.

34

С++ под рукой

while( выр аж ение ) опер а тор

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

label:

if( выражение )

{ оператор goto label ;

}

do оператор while( выражение ) ;

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

label: оператор if( выр ажение ) goto label ;

Оп ера т ор for

и е ) goto label ; О п ера т ор for for( операто � 1

for( операто 1 ; выражение 1 ; выражение2)

оператор2

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

оператор1

while ( вы раже ни е )

while ( вы раже ни е )

{

оператор2

выражение2;

}

за исключением тоrо, что оператор continue в операто­ ре2 будет вызывать продолжение процесса выполнения,

начиная с выражения2.

*

Оператор/ - это оператор, то е с ть он зака НIЧ ивается точкой с запятой.

Язык С++

35

Если оператор}- это объявление , то область действия объявленных переменных простирается до конца состав­

ного оператора2.

Оператор} и оба выражения могут быть оп·щеt· (но точки с запятыми должны оставаться). Когдс. Р J.жe­ нuel опущено, его значение считается ненулевым.

* В языке С о перат о р ] может быть только выражением.

36

С++ п од рукой

1 Орган из а ц ия программ ы

Программа на С ++ обычно состоит из двух типов файлов:

файлов заголовков и файлов кода. Файлы заголовков име­ ют расширение .h, а файлы кода - расширение .с. Достаточ­ но сложная программа использует различнЫе файлы каждого из этих типо в .

Файлы заголовков содержат классы, шаблоны:, структуры, объединения, перечисления и объявления функций, опи­ сания typedef, определения констант, функции inline и директивы препроцессора. Все вместе, это называется ин­ терфейсом к файлам кода. Файлы кода содержат решшза­ цию вашей программы.

1 Объявл ения

Описывают новый тип, переменную и ее тип, константу и ее значение или функцию, ее аргументы и возвращае­ мое значение.

Присваивают тип int, если тип не определен явно.

Статические и автоматические кл ас сы памяти

Все переменные, определенные вне функций, относятся к статическому классу памяти, то есть ни существуют все время, пока выполняется программа Все переменные, определенные внутри функций, по умолчанию относятся к

Приме ч ание : Э т и переменные т акже называют "глобальными " .

Язык С++

37

автоматическому IСЛассу памяти, то есть они существуют

только во время выполнения данной фунхции.

Чтобы переменная внутри функции относилась к статиче­ скому классу памяти, в ее объявлении нужно использовать префикс static, который является ключевым словом .

*

void Dryer( i n t clothe s )

{

staticcli ng: 11 Существует стол ько же скол ько и

}

11

11

программа

По умолчанию статические переменвые инициализируют­ ся значением ноль (или эквивалентным) до их использова­ ния и до иници'ализации на этапе выполнения (той, которая включает выражения). Автоматические перемен­ вые по умолчанию не инициализируются.

Статическая и внешняя область действия

Переменные, относящиеся к статическому классу памяти, объявленные вне функций, обычно имеют внешнюю об­ ласть действия; то есть переменные, объявленные в одном файле, могут быть доступны в другом файле, если они объявлены с префиксом extern, который является ключе­ вым словом.

11 Файл 1 int global:

* Для явно объявления автоматических леременных исnользуется клю- чевое слово auto. Это делают исключительно в целях улучшения читабель­ ности лрограммы.

38

С++ под ру к ой

11 Файл 2

extern l

t g lobal: 11 Доступ к g lobal из 1 -го файла

Чтобы сделать переменную,

обьявленную вне функции и

относящуюся к статическому классу памяти, недоступной из другого файла, ее нужно обьявить с использованием префикса static . Ключевое слово static ограничивает об- ласть видимости переменной границами файла, в котором **

она объявлена

11 Файл 1

static electricity;

.

11 Локал ьная в файле 1

11 Файл 2

extern electricity:

11 Ошибка при связывании

11 Файл 2а

i nt electricity:

11 Правильно

Область действия electricity из файла 1 ограничивае т ся границами этого файла. Другая переменная electricity мо­ жет быть объявлена в любом другом файле (файл 2а).

Простые типы

Это один из следующих типов:

char uпsi g пed char

Символ (один байт). Беззнаковый символ.

* Функции также могут быть обьяв.лены static с той же целью. Однако тот же эффект может быть достигнут, если прототип функции не включать в

файл заголовка, поскольку в С++

лены. Эта ВО3можность включена только для совместимости с С . **В этом контексте значение ключевого слова static изменяется с "посто­ янный"" на "собственный".

все функции должны быть явно об ьяв­

Язык С++

39

si g ned char int unsi g ned int

short int

unsi g ned short int lon g int

unsi g ned short int float

douЬle

lon g douЬle

void

Символ со знаком. Целое (обычно слово). Неотрицательное целое (имеет размер int).

Короткое целое (сло в о или nолу­ слово). Неотрицательное короткое целое. Длинное целое (слово или двойное

*

слово) . Неотрицательное длинное целое. Число с nла в ающей точкой оди­ нарной точности. Число с nлавающей точкой двой­ ной точности. Число с nлавающей точкой высо­ кой точности. Не имеет значения ** .

Обьявления unsig ned, lon g и short эквивалентны обьяв­ лениям unsig ned int, lon g int и short int соответственно. Является ли обявление char синонимом unsi g ned char или si g ned char, зависит от реализации комnилятора.

Все это для целых тиnов гарантирует, что

sizeof ( short ) sizeof ( int ) sizeof( lon g )

хот я обычно lon g в два раза длиннее, чем short. Для тиnов с nлавающей заnятой гарантируется, что

sizeof ( float ) sizeof ( douЬle ) sizeof ( lon g douЬle )

Могут быть инициализированы nри помощи выражения.

Нею;>торые реализации могут иметь тип long long, который используется для представления очень больших целых чисел (учетвренное слово) . **Нельзя объявить объект типа void. Однако можно объявить указатель на void (см. " Указатели") . Кроме то, функция может иметь возвращаемое значение типа void, что указывает на то, что функция не возвращает никако значения.

40

С++ под рукой

char brol led ; un slgn ed check = 1 97; long dl stan ce = АТ&Т;

Перечисления

Позволяют использовать имена вместо числовых значе­ ний.

Могут задавать имя типа.

Могут быть инициализированы: определенными (целы­ ми) значениями. Может также быть установлено на­

чальное

значение,

от которого

начинается

отсчет

значений (по умолчанию отсчет начинается с нуля) . Не­

сколько элементов перечисления могут иметь одно и то же значение.

en u m { chocolate, van l lla, strawberry } ; 11 chocolate =О, vanllla = 1, strawberry = 2

enum

Frult { orange, ch erry, ban an a } ; 11 Тип

en um Cost { perPerson = 2 , perCouple /* = 3 *1 } ;

Frult florlda = orange; 11 Обявление переменной типа

11

Frult *

Не могут дублироваться в пределах одной области види­ мости.

Для обьявления переменной перечислении в С ключевое слово enum должно использоваться !IВНО (если только не используется typedef). В С++ это необiiЗательно, но допустимо.

Язык С++

41

11

11

en um State { start, run , stop };

en um Posltlon { sta rt, mlddl e, en d } ; 11 Оши б ка

Могут быть объявлены внутри классов (см. "Классы") . Область видимости таких перечислений ограничена классом, в котором они объявлены .

class lceCream

{

11

pu bll c:

en um Flavor { chocolate, van llla, strawberry };

Flavor flavor;

} ;

Flavor favorlte; 11 Ош ибка; Flavor отсюда недоступен lceCream homeMade; homeMade.flavor = chocolate; 11 Ошибка homeMade.flavor = lceCream::chocolate; 11 Правильно

Вект оры

Это непрерывные блоки памяти, хранящие множество элементов одного и того же типа.

Объявляются посредством указания числа элементов, которое должно быть положительным целым констант­ ным выражением, заключенным в квадратные скобки

[

].

Имеют только одну размерность. Многомерные массивы, используемые в друmх языках, в С ++ представляются

в ранних версиях С++ перечислении в к.л ассах не явля ют ся локальны ми.

42

С++ под ру кой

вектором указателей на векторы.

float vf[ 1 0];

l

char *v pc[5] ;

n t

vv l[50