2012-11-23 9 views
18

Ecco un esempio di lavoro minima:Perché una funzione membro statico _declared_ static, ma _defined_ altrimenti in C++?

Ah:

class A{ 
     static int a_member_function(); 
}; 

A.cpp

#include "A.h" 
int A::a_member_function(){return 5;} 


int main(){ return 1;} 

Questo codice viene compilato ed eseguito, ma, mi sembra che:

static int A::a_member_function(){return 5;} 

potrebbe essere usato altrettanto facilmente per definire la funzione membro statico di c lass A. In effetti, sembra che potrebbe essere piuttosto utile avere questo requisito, dal momento che ricorderebbe al lettore del file .cpp che a_member_function è statico.

Tuttavia, questo chiaramente non funziona:

error: cannot declare member function ‘static int A::a_member_function()’ to have static linkage [-fpermissive] 

Così perché non funziona? Qual è il ragionamento dietro questa decisione?

risposta

23

La ragione è lo spirito C++ per cercare di minimizzare il numero delle sue parole chiave e mantenere la compatibilità con C: static in quella posizione ha un significato completamente diverso.

Torna indietro a C. Le funzioni "statiche" in C sono funzioni esclusive di un'unità di compilazione (un file .c). Non è possibile accedervi da altre unità di compilazione (è un modo per incapsulare in C). Questo utilizzo è ancora valido in C++. Puoi anche fare lo stesso per le variabili globali per limitarne l'ambito.

Anche se in C++ si desidera dichiarare funzioni membro come static per un motivo diverso: quelle funzioni appartengono alla classe ma non richiedono e l'istanza di detta classe deve essere eseguita (scommetto che lo sai già, sto solo provando per essere completo).

La definizione di una funzione membro come static comporterebbe una contraddizione: è necessario accedere a tale funzione al di fuori della relativa unità di traduzione.

C'è un altro caso di riutilizzo di parole chiave tra C e C++, la parola chiave auto in C++ 11, ma è meno probabile che sia un problema.

Nota: La stessa cosa accade con la parola chiave virtual che è presente nella dichiarazione e non la definizione.

+0

Ah. Ha un qualche senso. Grazie! –