Программирование >>  Перегруженные имена функций и идентификаторы 

1 ... 45 46 47 [ 48 ] 49 50 51 ... 210


Например:

int * int *[3] int *() int (*)()

именует, соответственно, типы целое , указатель на целое , указатель на массив из трех целых , функция, возвращающая указатель на функцию, возвращающую целое и указатель на целое .

Простое имя типа есть имя типа, состоящее из одного идентификатора или ключевого слова.

Простое имя типа:

typedef-имя

char

short

long

unsigned

float

double

Они используются в альтернативном синтаксисе для преобразования типов.

Например:

(double) a может быть также записано как

double (a)

Определение типа typedef

Описания, содержащие спецификатор описания typedef,

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



Синтаксис:

typedef-имя: идентификатор

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

Например, после

typedef int MILES, *KLICKSP; struct complex { double re, im; }; каждая из конструкций

MILES distance;

extern KLICKSP metricp;

complex z, *zp;

является допустимым описанием; distance имеет тип int, metricp имеет тип указатель на int .

typedef не вводит новых типов, но только синонимы для типов, которые могли бы быть определены другим путем. Так в приведенном выше примере distance рассматривается как имеющая в точности тот же тип, что и любой другой int объект.

Но описание класса вводит новый тип.

Например:

struct X { int a; }; struct Y { int a; }; X a1;

Y a2;

int a3;

описывает три переменных трех различных типов. Описание вида:

агрег идентификатор ;

enum идентификатор ; определяет то, что идентификатор является именем некоторого (возможно, еще не определенного) класса или перечисления. Такие описания позволяют описывать классы, ссылающихся друг на друга.



Например:

class vector; class matrix

friend matrix operator* (matrix&,vector&);

class vector

friend matrix operator* (matrix&,vector&);

Перегруженные имена функций

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

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

Из обычных арифметических преобразований для вызова перегруженной функции выполняются только char->short->int, int->double, int->long и float->double.

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

Например:

overload abs; int abs (int); double abs (double);

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

Например, abs(12) вызывает abs(int), а abs(12.0) будет вызывать abs(double). Если бы б1 зарезервирован порядок вызова, то оба обращения вызвали бы abs(double).



1 ... 45 46 47 [ 48 ] 49 50 51 ... 210

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика