В C++ двум или более функциям может быть дано одно и то же имя при условии, что их списки параметров различаются либо числом параметров, либо их типами. В данном примере мы объявляем перегруженную функцию max():
int max ( int, int );
int max( const vector<int> & );
int max( const matrix & );
Для каждого перегруженного объявления требуется отдельное определение функции max() с соответствующим списком параметров.
Если в некоторой области видимости имя функции объявлено более одного раза, то второе (и последующие) объявление интерпретируется компилятором так:
// перегруженные функции
void print( const string & );
void print( vector<int> & );
// объявления одной и той же функции
void print( const string &str );
void print( const string & );
Имена параметров при сравнении объявлений во внимание не принимаются;
unsigned int max( int i1, int i2 );
int max( int i1, int i2 ); // ошибка: отличаются только типы
// возвращаемых значений
Перегруженные функции не могут различаться лишь типами возвращаемого значения;
// объявления одной и той же функции
int max ( int *ia, int sz );
int max ( int *ia, int = 10 );
Ключевое слово typedef создает альтернативное имя для существующего типа данных, новый тип при этом не создается. Поэтому если списки параметров двух функций различаются только тем, что в одном используется typedef, а в другом тип, для которого typedef служит псевдонимом, такие списки считаются одинаковыми, как, например, в следующих двух объявлениях функции calc(). В таком случае второе объявление даст ошибку компиляции, поскольку возвращаемое значение отличается от указанного раньше: