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

While(1)//бесконечный цикл

{

cout<<"\n Enter the number";

cin>>n;

Fptr[n]();//вызов функции с номером n

}

}

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

Пример.

#include <iostream.h>

#include <math.h>

typedeffloat(*fptr)(float);//тип – указатель на функцию

floatroot(fptrf,floata,floatb,floate)//решение уравнения методом половинного деления

//уравнение передается с помощью указателя на функцию

{float x;

do

{

x=(a+b)/2;

if ((*f)(a)*f(x)<0)b=x; else a=x;

}

while((*f)(x)>e&&fabs(a-b)>e);

return x;

}

float testf(float x)

{return x*x-1;}

void main()

{

float res=root(testf,0,2,0.0001);

cout<<”\nX=”<<res;

}

18. Ссылки на функцию

Подобно указателю на функцию определяется и ссылка на функцию:

тип_функции(&имя_ссылки)(параметры) инициализирующее_выражение;

Пример.

intf(floata,intb){. . . }//определение функции

int(&fref)(float,int)=f;//определение ссылки

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

Пример.

#include <iostream.h>

void f(char c)

{cout<<”\n”<<c;}

void main()

{

void(*pf)(char);//указатель на функцию

void(&rf)(char);//ссылка на функцию

f(‘A’);//вызов по имени

pf=f;//указатель ставится на функцию

(*pf)(‘B’);//вызов с помощью указателя

rf(‘C’);//вызов по ссылке

}

19. Типы данных, определяемые пользователем

    1. Переименование типов

Типу можно задавать имя с помощью ключевого слова typedef:

typedefтип имя_типа [размерность];

Примеры:

typedef unsigned int UNIT;

typedefcharMsg[100];

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

UNIT a,b,c;//переменные типа unsigned int

Msgstr[10];// массив из 10 строк по 100 символов

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

Если надо определить несколько именованных констант таким образом, чтобы все они имели разные значения, можно воспользоваться перечисляемым типом:

enum[имя_типа] {список констант};

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

Пример:

Enum Err{ErrRead, ErrWrite, ErrConvert);

Err error;

. . . .

switch(error)

{

case ErrRead: …..

case ErrWrite: …..

caseErrConvert: …..

}

    1. Структуры

Структура – это объединенное в единое целое множество поименованных элементов данных. Элементы структуры (поля) могут быть различного типа, они все должны иметь различные имена.

Форматы определения структурного типа следующие:

1. structимя_типа //способ 1

{

тип 1 элемент1;

тип2 элемент2;

. . .

};

Пример:

structDate//определение структуры

{

int day;

int month;

int year;

};

Date birthday;//переменная типа Date

  1. struct//способ 2

{

тип 1 элемент1;

тип2 элемент2;

. . .

} список идентификаторов;

Пример:

struct

{

int min;

int sec;

int msec;

}time_beg,time_end;

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

Во втором случае описание структуры служит определением переменных.

  1. Структурный тип можно также задать с помощью ключевого слова typedef:

Typedef struct //способ 3

{

floar re;

float im;

}Complex;

Complex a[100];//массив из 100 комплексных чисел.