Язык программирования C++. Вводный курс


Как перегрузить имя функции - часть 2


// объявления одной и той же функции

int max ( int *ia, int sz );

int max ( int *ia, int = 10 );

Ключевое слово typedef

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

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

// typedef не вводит нового типа

typedef double DOLLAR;

// ошибка: одинаковые списки параметров, но разные типы

// возвращаемых значений

extern DOLLAR calc( DOLLAR );

extern int calc( double );

Спецификаторы const или volatile при подобном сравнении не принимаются во внимание. Так, следующие два объявления считаются одинаковыми:

// объявляют одну и ту же функцию

void f( int );

void f( const int );

Спецификатор const

важен только внутри определения функции: он показывает, что в теле функции запрещено изменять значение параметра. Однако аргумент, передаваемый по значению, можно использовать в теле функции как обычную инициированную переменную: вне функции изменения не видны. (Способы передачи аргументов, в частности передача по значению, обсуждаются в разделе 7.3.) Добавление спецификатора const к параметру, передаваемому по значению, не влияет на его интерпретацию. Функции, объявленной как f(int), может быть передано любое значение типа int, равно как и функции f(const int). Поскольку они обе принимают одно и то же множество значений аргумента, то приведенные объявления не считаются перегруженными. f()

можно определить как

void f( int i ) { }

или как

void f( const int i ) { }

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

Однако, если спецификатор const или volatile

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

// объявляются разные функции

void f( int* );

void f( const int* );

 

// и здесь объявляются разные функции

void f( int& );

void f( const int& );




Начало  Назад  Вперед



Книжный магазин