2010-04-06 29 views
19

voglio chiedere puntatore in C++C++ puntatore a funzione, Beginner Domanda

ho qualche semplice codice:

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

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

ora, supponiamo che io chiamo le funzioni che utilizzano questo modo:

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

o forse

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

c'è qualche differenza? perché quando ho provato, il risultato è lo stesso e senza errori.

Grazie mille

risposta

0

credo che la seconda chiamata risolve automaticamente alla prima chiamata nel compilatore ...

+0

quindi, vuoi dire, la seconda chiamata è quella giusta? – BobAlmond

+1

no, voglio dire che il compilatore risolve una chiamata a un puntatore di funzione, ed è davvero una questione di preferenza sintattica. –

10

funzione sarà implicitamente colato a un puntatore in base al C++ standard (4,3/1). Non c'è differenza. Tuttavia questa conversione non si applica mai alle funzioni membro non statiche. Per loro dovresti scrivere esplicitamente &.

3

Non c'è differenza. Per coerenza con altri modi di ottenere un puntatore è possibile utilizzare &, ma il nome di per sé non avrebbe altro significato quindi si presume che significhi "ottenere l'indirizzo".

è molto simile a matrice nomi delle variabili che agiscono come l'indirizzo del primo elemento della matrice.

0

è perché non esiste tale oggetto (in termini di espressioni) come funzione , ci sono solo puntatori a funzioni. Quando vuoi passare la funzione alla tua funzione, l'unica cosa che puoi effettivamente passare è il puntatore, quindi il compilatore fa questo cast per te

+0

Ci sono oggetti chiamati funzioni (in termini di espressioni): 'add' è un tale oggetto, il suo tipo è' int (int, int) '. Tuttavia, in molti contesti, implicitamente decadono a puntatori a se stessi. – avakar

+0

si prega di mostrare un esempio in cui la funzione e il puntatore a funzionare come termine di espressione sono realmente diversi – Andrey

+0

Sì, le funzioni non sono oggetti, ma sono funzioni (sorpresa xD). Ad esempio 'void f() {} void (& fr)() = f;' funziona perché f è un'espressione di tipo di funzione e si associa il riferimento ad esso, mentre 'void (& fr)() = & f;' non funziona perché '& f' è un'espressione del tipo di puntatore. Un altro esempio: prova a fare 'sizeof (f)' e noti che fallisce, perché le funzioni non hanno una dimensione. Come dice @avakar, il tipo di f qui è 'void()', e quello di add è 'int (int, int)' –

3

No, in questo caso particolare non c'è differenza. O uno ti dà l'indirizzo della funzione.

Si noti, tuttavia, che in C++, ottenendo un puntatore a una funzione membro richiede che si utilizzi l'operatore '&'.

1

noti che si possono avere i riferimenti alle funzioni

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

ora chiedono con &add non funziona più perché si tenta di associare un riferimento funzione per un puntatore invece che a una funzione. A volte questo traspare quando si utilizzano i modelli

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

Ora chiamandolo con runner(10, 20, add, add) non riuscirà perché T è cercato di dedurre sia un puntatore a funzione e di un tipo di funzione (senza decadimento di un puntatore è fatto quando si passa ad un riferimento parametro!).

Problemi correlati