Структуры
Перечисления
Переименование типов
Типы данных, определяемые пользователем
Ссылки на функцию
Указатели на функции удобно использовать в тех случаях, когда функцию надо передать в другую функцию как параметр.
Пример.
#include <iostream.h>
#include <math.h>
typedef float(*fptr)(float);//тип – указатель на функцию
float root(fptr f, float a, float b, float e)//решение уравнения методом половинного деления
//уравнение передается с помощью указателя на функцию
{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;
}
Подобно указателю на функцию определяется и ссылка на функцию:
тип_функции(&имя_ссылки)(параметры) инициализирующее_выражение;
Пример.
int f(float a,int b){. . . }//определение функции
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’);//вызов по ссылке
}
Типу можно задавать имя с помощью ключевого слова typedef:
typedef тип имя_типа [размерность];
Примеры:
typedef unsigned int UNIT;
typedef char Msg[100];
Такое имя можно затем использовать также как и стандартное имя типа:
UNIT a,b,c;//переменные типа unsigned int
Msg str[10];// массив из 10 строк по 100 символов
Если надо определить несколько именованных констант таким образом, чтобы все они имели разные значения, можно воспользоваться перечисляемым типом:
enum [имя_типа] {список констант};
Константы должны быть целочисленными и могут инициализироваться обычным образом. Если инициализатор отсутствует, то первая константа обнуляется, а остальным присваиваются значение на единицу большее, чем предыдущее.
Пример:
Enum Err{ErrRead, ErrWrite, ErrConvert);
Err error;
. . . .
switch(error)
{
case ErrRead: …..
case ErrWrite: …..
case ErrConvert: …..
}
Структура – это объединенное в единое целое множество поименованных элементов данных. Элементы структуры (поля) могут быть различного типа, они все должны иметь различные имена.
Форматы определения структурного типа следующие:
1. struct имя_типа //способ 1
{
тип 1 элемент1;
тип2 элемент2;
. . .
};
Пример:
struct Date//определение структуры
{
int day;
int month;
int year;
};
Date birthday;//переменная типа Date
2) struct //способ 2
{
тип 1 элемент1;
тип2 элемент2;
. . .
} список идентификаторов;
Пример:
struct
{
int min;
int sec;
int msec;
}time_beg,time_end;
В первом случае описание структур определяет новый тип, имя которого можно использовать наряду со стандартными типами.
Во втором случае описание структуры служит определением переменных.
3) Структурный тип можно также задать с помощью ключевого слова typedef:
Typedef struct //способ 3
{
floar re;
float im;
}Complex;
Complex a[100];//массив из 100 комплексных чисел.