C ++ указатель на функции, вопрос для начинающих - PullRequest
19 голосов
/ 06 апреля 2010

Я хочу спросить об указателе в 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);

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

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

Ответы [ 6 ]

10 голосов
/ 06 апреля 2010

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

3 голосов
/ 06 апреля 2010

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

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

3 голосов
/ 06 апреля 2010

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

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

1 голос
/ 07 апреля 2010

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

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

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

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 пытаются определить как по указателю функции, так и по типу функции (нет затухания в указателесделано при передаче в опорный параметр!).

0 голосов
/ 06 апреля 2010

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

0 голосов
/ 06 апреля 2010

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

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