С++ для начинающих




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


В 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(). В таком случае второе объявление даст ошибку компиляции, поскольку возвращаемое значение отличается от указанного раньше:




          Содержание  Назад  Вперед