Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Электронный конспект лекций (семестр 1).doc
Скачиваний:
30
Добавлен:
29.02.2016
Размер:
321.02 Кб
Скачать
    1. Одинаковое именование нескольких функций (перегрузка функций)

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

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

    1. Параметры функций по умолчанию

При объявлении функций в языке C++ имеется возможность за­дать значения параметров по умолчанию:

double ехр (double x, unsigned int e = 2)

{

double result = 1;

for (unsigned int i = 0; i < e; i++)

result *= x;

return result;

}

int main ()

{

double y = ехр (3.14); // 3.14 в квадрате

double x = ехр (2.9, 5); // 2.9 в пятой степени

...

}

Значение параметра по умолчанию задается либо в прототипе, либо в заголовке функции, но не в обеих этих конструкциях одновременно.

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

    1. Передача параметров функции по адресу

В языках программирования параметры подпрограммам могут передавать двумя способами. Первый – это передача параметров “по значению”. При его выполнении содержимое (значение) фактического параметра копируется в формальный параметр подпрограммы, после чего связь формального и фактического параметра прерывается. Изменения, сделанные в формальном параметре, не влияют на значение переменной, используемой при вызове. Именно этот способ и рассматривался нами ранее.

Вторым способом передачи параметров является передача “по адресу”. При использовании данного способа в формальный параметр вызываемой подпрограммы копируется адрес фактического параметра. В подпрограмме этот адрес используется для доступа к настоящему фактическому параметру, то есть, изменения, сделанные в формальном параметре, происходят в переменной, использованной при вызове.

Передача параметров “по адресу” позволяет неявно обойти ограничение, состоящее в том, что подпрограмма может возвращать не более одного результатирующего значения. Передав по адресу несколько фактических параметров, в подпрограмме можно изменить их значения, вернув таким образом в вызывающую подпрограмму несколько результатов.

В С++ второй способ передачи параметров реализован с помощью ссылок. Для обозначения ссылки в списке формальных параметров после указания типа соответствующего параметра используется знак &.

    1. Библиотека стандартных функций

Ряд функций, которые часто используются во многих программах, образуют библиотеку стандартных функций языка С++, большинство из которых пришли из языка С.

Библиотека стандартных функций является частью практически любого компилятора языка C++ и позволяет программистам использовать готовые функции в своих программах. В состав библиотеки входят математические функции (вычисление логарифма, квадратного корня, возведение в произвольную степень и т.д.), функции ввода-вывода, функции обработки строк и символов и ряд других. Для работы со стандартными функциями необходимо включать в программу файлы заголовков, которые содержат объявления нужных стандартных функций.

Так, для выполнения математических стандартных функций нужно подключить к программе файл заголовков math.h:

#include <math.h>

. . .

double x=sqrt (a); // вычисление квадратного корня переменной a

. . .

  1. Язык C++: стиль записи программ

При записи программ важно придерживаться определенного стиля записи. Прежде всего, стиль выражается в способе именования переменных и функций и в распо­ложении операторов программы. Наличие правильного стиля облегчает изучение программ. Разбираться в программах, написанных в разных стилях, гораздо сложнее. Известно, что чтение программ с целью их проверки или модификации – не менее важное и редкое дело, чем их написание, и следует максимально облегчить это занятие.

В мировом программистском сообществе давно сложились представления о хорошем стиле программирования, и знание их свидетельствуют об уровне квалификации специалиста.

Итак, каждый оператор рекомендуется писать в отдельной строке. Допускается несколько коротких присваиваний в одной строке.

Пустые строки обычно разделяют однородные группы операторов. Например, можно поставить пус­тую строку между объявлением переменных и первым выполняемым оператором, перед группой логически связанных операторов.

При написании программ важно подчеркнуть структуру программы. Рекомендуемым средством достижения этой цели является отступ от левого края и расположение фигурных скобок. С левого края начинаются только описания функций, глобальных переменных и типов данных. Начало блока (открывающая фигурная скобка) увеличивает отступ следующего оператора от левого края на некоторое фиксированное число пробелов (обычно на та­буляцию или на 3-4 пробела):

int

sum (int x, int y, int z)

{

return x + y + z; // запись с отступом

}

Как видно из примера, тип возвращаемого значения записан от­дельной строкой, в следующей строке записано имя функции с формаль­ными параметрами, с той же позиции в следующей строке – левая (открывающая) фигур­ная скобка. Тело функции, в данном случае состоящее из одного оператора, записано с отступом. Правая (закрывающая) фигурная скобка убира­ет отступ и записывается под именем функции.

Зависимость операторов друг от друга также подчеркивается отступом. Например, выполняемый оператор в операторе if зависит от усло­вия, поэтому он записывается с отступом от позиции начала оператораif:

int

abs (int x)

{

if (x >= 0) // одинарный отступ

return x; // двойной отступ

else

return -x;

}

В операторах if-elseбез вложенностиelseрасполагается под соответствующимif.

Если в операторе ifиспользуется блок, то открывающаяся фигур­ная скобка ставится на той же строчке, где и условие, а закрывающаяся – на новой строчке в той же позиции,что иif. Если после этого следует конструкцияelseилиelse if, она начинается в той же строке через пробел:

if ( условие_1 ) {

операторы

} else if ( условие_2 ) {

операторы

} else {

операторы

}

Аналогичное правило используется для операторов цикла – тело цикла пишется с отступом по сравнению с заголовком цикла, закрываю­щаяся фигурная скобка убирает дополнительный отступ. Особенно важно придерживаться правил отступа при использовании вложенных циклов и условных операторов. Закрывающаяся фигурная скобка должна нахо­диться на том же уровне, что и начало соответствующего условного оператора или цикла:

for (int i = 0; i < n; i++) {

if (x > 0) {

while (true) {

операторы

} // конец тела цикла while

} // конец тела if

} // конец тела цикла for

Немного отличается написание оператора switch. Несмотря на то, что после заголовка оператора ставится открывающаяся фигурная скобка, все меткиcaseилиdefaultрасполагаются на том же уровне, что иswitch. Однако операторы, соответствующие меткам, пишутся с отступом:

switch (code) {

case 1:

x = 1;

break;

case 2:

x = 2;

break;

default:

;

}

Те же цели – легкость понимания и удобства чтения – преследуют правила именования. Использование одно- или двух буквенных идентификаторов в качестве имен переменных допустимо только, если это временные локальные переменные, смысл которых и так ясен из контекста. Однобуквенные идентификаторы i, j, k, lтакже часто используют в качестве переменных цикла. Чаще всего имена функций, переменных и т.д. составляются из английских слов, описывающих их смысл. Имена функций целесообразно писать с маленькой буквы, также как и имена переменных. Имена констант целесообразно составлять из заглавных букв. Если имена констант состоят из нескольких слов, в качестве разделителя используется подчеркивание:

fact, width, length, BITS_IN_BYTE

  1. Язык C++: встроенные типы данных

Большинство программ на языке C++ представляет и обрабатывает данные. Любые данные принадлежат к какому-то из типов. Тип данных определя­ет возможные значения данных и набор определенных для них операций. Напри­мер, данные типа short(“короткие” целые числа со знаком) могут принимать числовые значения от -32768 до 32767. Для данных этого типа определены обычные арифметические операции и правила выполнения этих опе­раций при, например, переполнении, то есть при выходе результата за грани­цы допустимых значений этого типа.

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

Встроенные типы данных предопределены в языке. Это основные, “базовые” типы, из которых составляют все производные типы. Различные реализации и различные компиляторы могут оп­ределять различные диапазоны значений целых и вещественных чисел.

В табл. 1 перечислены встроенные типы данных языка C++ и приведены наиболее типичные диапазоны их значений.

Таблица 1. Встроенные типы данных языка C++.

Название

Обозначение

Число байтов

Диапазон значений

Символ

char

1

от -128 до +127

Символ без знака

unsigned char

1

от 0 до 255

Короткое целое число

shortint

2

от -32768 до +32767

Короткое целое число без знака

unsigned short int

2

от 0 до 65535

Длинное целое число

long int

4

от -2147483648 до +2147483647

Длинное целое число без знака

unsigned long int

4

от 0 до 4294967295

Вещественное число одинарной точности

float

4

от ±3.4е-38 до ±3.4е+38 (7 значащих цифр)

Вещественное число двойной точности

double

8

от ±1.7е-308 до ±1.7е+308 (15 значащих цифр)

Вещественное число увеличенной точности

long double

10

от ±1 .2е-4932 до. ±1 .2е+4932

Логическое значе­ние

bool

1

значения true(истина) илиfalse(ложь)