Синтаксис вызова функции через разыменование указателя - PullRequest
0 голосов
/ 30 мая 2018

Рассмотрим код

int add(int a, int b)
{
    return a + b;
}    

int main()
{
    std::cout << (*add)(3, 2);
}

Какой смысл разыменовывать указатель на функцию ???

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

Почему этот синтаксис вызова функции существует в C ++?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Этот синтаксис существует, потому что он был у C, а синтаксис C ++ изначально был основан на C.

Нет различий в поведении кода f(args) и (*f)(args).

0 голосов
/ 31 мая 2018

Я не могу быть уверен, что прав, но вот возможное объяснение: каждая функция в c, а также в c ++ является потенциальной переменной.Возможное объявление функции:

int (*MyFunction)(int, double);

В этом случае - имя переменной: MyFunction |Тип: функция, которая возвращает int с int, double параметрами.

Таким образом, даже когда вы объявляете функцию, вы фактически объявляете переменную с типом "функция".В этом случае имеет смысл, почему вы можете использовать, в вашем случае, (*add)(3, 2) для вызова функции (или с помощью переменной).

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

int(*MyFunction)(int, double) = [](int a, double b) -> int {
    return (int)((a + b) * 10);
};

Здесь мы объявляем переменную типа функции и реализуем для нее функцию с помощью лямбда-выражения.Теперь мы можем использовать его в двух формах:

MyFunction(1, 2.5); // Like a regular function
(*MyFunction)(1, 2.5); // As a function type variable

Опять же, это самое разумное объяснение, которое я мог придумать.Я не уверен, что это правильное / лучшее / полное объяснение, но я надеюсь, что оно дало вам новый взгляд на функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...