Я хочу спросить об указателе в 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);
есть ли какое-либо различие? потому что, когда я попробовал, результатом является то же и без ошибки.
Большое спасибо
это потому, что нет такого объекта (в терминах выражений), как функция , есть только указатели на функции . Когда вы хотите передать функцию своей функции, единственное, что вы можете передать, - это указатель, поэтому компилятор выполняет это приведение за вас
Нет, в данном случае разницы нет. Любой из них дает вам адрес функции.
Однако обратите внимание, что в C ++ для получения указателя на функцию член необходимо использовать оператор '&'.
Функция будет быть неявно приведенным к указателю в соответствии со стандартом C ++ (4.3 / 1). Нет никакой разницы. Однако это преобразование никогда не применяется к нестатическим функциям-членам. Для них вы должны явно написать &
.
Обратите внимание, что у вас могут быть ссылки на функции
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
пытаются вывести как на указатель функции и тип функции (при переходе к параметру ссылки не происходит распада на указатель!).
Я считаю, что второй вызов автоматически преобразуется в первый вызов в компиляторе ...
Нет разницы. Для согласованности с другими способами получения указателя вы можете использовать и
, но само по себе имя не имеет другого значения, поэтому предполагается, что оно означает «получить адрес».
Это очень похоже на то, что имена переменных массива действуют как адрес первого элемента массива.