2012-10-02 3 views
5

L'overloading delle funzioni può verificarsi tra due funzioni membro che hanno lo stesso numero di parametri, se uno di essi viene dichiarato come const.overloading delle funzioni con parametri const

Ma cosa succede se una funzione ha un argomento const, un'altra ha un argomento non const dello stesso tipo? Funzionerà per riferimenti e puntatori? Se C++ lo fornisce, perché fornisce? Per favore condividi il motivo con me se lo sai.

Di seguito è riportato l'esempio che consente di comprendere lo scenario precedente.

void fun(const int i) 
{ 
    cout << "fun(const int) called "; 
} 
void fun(int i) 
{ 
    cout << "fun(int) called " ; 
} 
int main() 
{ 
    const int i = 10; 
    fun(i); 
    return 0; 
} 

uscita: Errore del compilatore: redefinition of 'void fun(int)'

void fun(char *a) 
{ 
    cout<<"non-const fun() called"; 
} 

void fun(const char *a) 
{ 
    cout<<"const fun() called"; 
} 

int main() 
{ 
    const char *ptr = "GeeksforGeeks"; 
    fun(ptr); 
    return 0; 
} 

uscita: divertimento const() chiamato

Perché il secondo permesso in C++?

+2

Provare con 'void fun (char * const a)' – PiotrNycz

+0

C'è ancora qualcosa nella mia risposta? Se sì, per favore dimmelo, così posso migliorarlo. :) In caso contrario, posso suggerire di accettarlo? – Xeo

risposta

9

I parametri del primo sono livello superioreconst. Ciò significa che la funzione non può modificare il valore del parametro, tuttavia, al chiamante non interessa: il callee ottiene copia dell'argomento, quindi se un parametro ha livello superioreconst, è un dettaglio di implementazione. Si noti che le seguenti opere:

void f(int); // forward declare 

void g(){ f(42); } 

void f(int const i){ /*...*/ } // define above declared function 

Per la seconda serie di sovraccarichi, il const non è più di primo livello. Descrive se il callee può cambiare o meno cosa punta il puntatore su. Come chiamante, è fare a tale proposito. Non è più solo un dettaglio di implementazione.

+2

Vale la pena notare che la coppia alla 3a funzione è 'void fun (char * const a)' – PiotrNycz