Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
40
Добавлен:
16.02.2016
Размер:
382.98 Кб
Скачать

Функции с переменным числом параметров

Функция может иметь переменное число параметров: это указывается в конце списка параметров символом многоточия ... . Функции с переменным числом параметров должны иметь как минимум один описанным формальный параметр.

Для работы с переменным числом параметром можно использовать следующие средства:

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

valist указатель_списка_параметров;

// Инициализация указателя и установка его на начало

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

va_start(указатель_списка_параметров, последний_параметр);

// Выбор следующего параметра

// и продвижение указателя (согласно типу)

va_arg(указатель_списка_параметров,i);

// Установка указателя на список параметров равным null.

va_end((указатель_списка_параметров);

Указатели типа void

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

Пример:

void Fl(void *pV); //Прототип функции

piVar=new int;

pfVar=new float;

Fl(piVar); // Вызов функции для параметра типа int

Fl(pfVar); // Вызов функции для параметра типа float

// Определение функции void Fl(void *pV)

{

*pV=123; }

Указатели на функции

Указатели на функцию могут быть использованы для передачи функции в качестве параметра другой функции.

Указатель на функции может иметь следующее формальное описание:

тип (*имя_ функ_указателя)(параметры функции);

// Инициализация указателя

имя_ функ_указателя =имя_любой_функции;

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

(*имя_ функ_указателя)(параметры функции);

имя_ функ_указателя(параметры функции);

Указатель на функцию в качестве параметра другой функции может иметь следующее формальное описание:

тип имя_функции(тип_функ_ук (*имя_функ_указателя)(параметры функции));

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

имя_функции(имя функ указателя);

Допустимо также создавать массив указателей на функцию.

Пример:

int iFl(void);

int iF2(void);

int (iFArray[])(void)={ iFl, iF2};

// Вызов функции iF2: iFArray[l]();

// Вызов функции iFl: (*iFArray[0])();

Встроенные функции

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

Пример:

inline void myPrint(void) { cout«"Text"«endl;}

myPrint(void); // Вызов функции: в этом месте компилятором будет

// выполнено встраивание кода функции.

Перегрузка функций

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

Работа с памятью

Свободная память, которую можно заказывать в процессе выполнения программы, называется динамической памятью. Для выделения непрерывного блока памяти можно использовать функцию malloc(), для освобождения - free(). Прототипы этих функций расположены в заголовочном файле stdlib.h.

Пример:

int pInt_Buf;

// Выделение памяти под 10 переменных типа int

pInt_Buf=malloc( 10*sizeof(int));

При отсутствии требуемого количества памяти функция malloc возвращает значение null.

Выделение динамической памяти также можно выполнять оператором new, а освобождение - оператором delete. Оператор new автоматически учитывает тип объекта и выделяет требуемое количество памяти.

Пример:

int pInt_Buf;

// Выделение памяти под 10 переменных типа int

pInt_Buf=new int[10];

Выражения

Выражение состоит из операндов и операторов. Язык C++ позволяет программисту выполнять переопределение (перегрузку) стандартных операторов.

В выражениях можно использовать ключевое слово this, являющееся указателем на объект данного класса. Это ключевое слово нельзя использовать вне метода члена класса.

Квалификация имен

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

// квалификация именем класса:

qualified-class-name :: name

Операторы

Операторы языка C++ можно подразделить на следующие группы:

метки;

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

  • null-операторы;

  • операторы блока;

  • операторы выбора;

  • операторы цикла;

  • операторы перехода;

  • операторы управления исключениями;

  • операторы объявления.

Синтаксис операторов языка C++ в основном удовлетворяет стандарту ANSI С. Однако существуют незначительные отличия; например, C++ позволяет (используя оператор объявления) объявлять переменные не только в начале блока.

Метки

Метки - это специальные операторы, используемые операторами перехода для изменения последовательности выполнения программы.

Метки могут иметь следующее формальное описание:

labeled-statement:

identifier : statement только перед другим оператором

case constant-expression : statement только совместно с оператором switch

default : statement только совместно с оператором switch

Пример:

for(j = 0;j<5;++j) { if( (рАrrау[j] = fopen( pFNames[j], "r")) == NULL )

goto FileNotOpen; // Нельзя открыть файл

else

// Файл открыт

}

FileNotOpen:

cerr << "Ошибка открытия файла.\n");

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

Операторы выражения являются обычными выполняемыми операторами и завершаются символом ;. Примерами таких операторов могут служить вызовы функций.

Операторы выражения могут иметь следующее формальное описание:

expression-statement:

expressionopt ;

Null-операторы

Null-операторы - это операторы выражения, в которых отсутствует выражение. Такие операторы обозначаются символом ;. Как правило, они используются в операторах цикла (означая тело оператора цикла) или как помеченные операторы.

Пример:

char *strcpy( char *pDest, const char *pSource )

{ char *DestStart = Dest;

// Посимвольное копирование строки, выполняемое до нахождения

// символа конца строки (0-символа).

while( *pDest++ = *pSource++ )

; // Null-оператор,

return DestStart;

}

Операторы блока

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

Операторы блока могут иметь следующее формальное описание:

compound-statement:

{ statement-listopt }

statement-list:

statement

statement-list statement

Пример:

if( i > 10 )

{ // Оператор блока, вложенный в оператор if.

cout « " i > 10 \n";

i=0;

}

else

i++;

Операторы выбора

Язык C++ предоставляет два оператора выбора:

  • if

  • switch.

Эти операторы выбора могут иметь следующее формальное описание:

selection-statement:

if ( expression ) statement

if ( expression ) statement else statement

switch ( expression ) statement

case constant-expressionl : statement

break;

case constant-expression2 : statement

break;

default : statement

Оператор if позволяет в зависимости от значения выражения-условия выполнить один из двух указанных операторов (или блоков операторов).

В операторе if выполняется вычисление выражения-условия, заключенного в круглые скобки. Если это выражение-условие истинно, то выполняется оператор, следующий за круглыми скобками. В противном случае выполняется оператор, указанный после ключевого слова else.

Язык C++ не имеет базового логического типа. Поэтому выражение считается истинным, если оно может быть приведено к ненулевому значению, и ложным, если к нулю.

Допускаются вложенные операторы выбора if.

Соседние файлы в папке VC++Баженова