Указатель C++ на функции, Вопрос о Новичке

Я хочу спросить об указателе в C++

У меня есть некоторый простой код:

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

int runner(int x,int y, int (*functocall)(int, int)){
 return (*functocall)(x,y);
}

теперь, предположите, что я вызываю те функции с помощью этого пути:

cout<<runner(2,5,&add);

или возможно

cout<<runner(2,5,add);

есть ли какое-либо различие? потому что, когда я попробовал, результатом является то же и без ошибки.

Большое спасибо

19
задан Matthieu M. 7 April 2010 в 07:40
поделиться

6 ответов

это потому, что нет такого объекта (в терминах выражений), как функция , есть только указатели на функции . Когда вы хотите передать функцию своей функции, единственное, что вы можете передать, - это указатель, поэтому компилятор выполняет это приведение за вас

0
ответ дан 30 November 2019 в 05:01
поделиться

Нет, в данном случае разницы нет. Любой из них дает вам адрес функции.

Однако обратите внимание, что в C ++ для получения указателя на функцию член необходимо использовать оператор '&'.

3
ответ дан 30 November 2019 в 05:01
поделиться

Функция будет быть неявно приведенным к указателю в соответствии со стандартом C ++ (4.3 / 1). Нет никакой разницы. Однако это преобразование никогда не применяется к нестатическим функциям-членам. Для них вы должны явно написать & .

10
ответ дан 30 November 2019 в 05:01
поделиться

Обратите внимание, что у вас могут быть ссылки на функции

int runner(int x,int y, int (&functocall)(int, int)){
 return functocall(x,y);
}

Теперь вызовите его с помощью и добавьте won ' t больше не работают, потому что вы пытаетесь привязать ссылку на функцию к указателю, а не к функции. Иногда это проявляется при использовании шаблонов

template<typename T>
int runner(int x,int y, T &functocall, T otherfunc){
 return functocall(x,y) + otherfunc(y, x);
}

Теперь вызов его с помощью runner (10, 20, add, add) завершится ошибкой, потому что T пытаются вывести как на указатель функции и тип функции (при переходе к параметру ссылки не происходит распада на указатель!).

1
ответ дан 30 November 2019 в 05:01
поделиться

Я считаю, что второй вызов автоматически преобразуется в первый вызов в компиляторе ...

0
ответ дан 30 November 2019 в 05:01
поделиться

Нет разницы. Для согласованности с другими способами получения указателя вы можете использовать и , но само по себе имя не имеет другого значения, поэтому предполагается, что оно означает «получить адрес».

Это очень похоже на то, что имена переменных массива действуют как адрес первого элемента массива.

3
ответ дан 30 November 2019 в 05:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: