Как происходит восстановление функции при перегрузке в C ++? - PullRequest
2 голосов
/ 08 августа 2011

Я новичок в C ++.Я хотел знать, как внутренне происходит перегрузка функций в C ++

Ответы [ 2 ]

5 голосов
/ 08 августа 2011

Я рекомендую вам прочитать C ++ Primer . Эта концепция объясняется подробно.

На более высоком уровне допустима перегрузка функции, если обе функции

  • имеют то же имя
  • заявлено в том же объеме
  • имеет другой список параметров.

На нижнем уровне (внутри того, как это вычисляет компилятор), вот как это делается.

Для разрешения перегрузки функций предусмотрено 3 шага.

e.g void f();   
    void f(int);
    void f(double, double = 3.4);
    void f(char *, char *);

    Function call inside main -> void f(5.6);
  1. Определяет набор перегруженных функций, рассматриваемых для вызова, они вызываются как функции-кандидаты. Функция-кандидат - это функция с тем же именем, что и вызываемая функция, и для которой объявление видно в точке вызова. Он также определяет свойства списка аргументов в вызове функции, т. Е. Нет аргументов и их типы.

    Выбрано: Все 4 функции с именем 'f'

  2. Выбирает функцию из набора функций-кандидатов, найденных на шаге 1, которые можно вызывать с аргументами, указанными в вызове. Они называются жизнеспособными функциями. Жизнеспособная функция - это функция, которая имеет то же самое число параметров или больше параметров (параметры addn имеют связанный аргумент по умолчанию), чем аргументы в реальном вызове функции. Типы аргументов должны быть конвертируемыми, чтобы функция была классифицирована как жизнеспособная.

    Выбрано: void f (int) и void (double, double = 3.4)

  3. Определяет лучшую жизнеспособную функцию среди всех жизнеспособных функций. Для (int) преобразования необходимо применить, которое является стандартным преобразованием (double to int). Но для (double, double = 3.4) точное совпадение, поэтому преобразование не требуется. Нет конверсии лучше, чем конверсия.

    Выбрано: void (double, double = 3.4)

3 голосов
/ 08 августа 2011

Это происходит внутри с искаженными именами.

Для файла

void blah(int f)
{
}

void blah(double f)
{}

Я получаю символы

ethan@EthanPc ~ % nm blah.o   
0000000000000009 T _Z4blahd
0000000000000000 T _Z4blahi

Обратите внимание на d для двойного и i для целого числа.

...