L’output del metodo statico c ++ usando cout è sempre 1

Quindi ho un pezzo di codice con una class del genere:

#include #include class stu { static int proba; public: stu(); static int no(){ return proba; } }; int stu::proba=0; stu::stu() { proba=proba+1; } int main() { std::cout<< stu::no << std::endl; } 

L’output è 1. Lo fa anche se cambio stu::no modo che sia solo {return 12;} Perché succede? Come lo aggiusto??

std::cout<< stu::no() << std::endl; in std::cout<< stu::no() << std::endl;

Senza il () , credo che stia valutando come un puntatore e non facendo quello che ti aspetti.

Modifica: come indicato da @Loomchild, l'uso di g++ -Wall fornirà ulteriori informazioni sul perché è sempre 1. Il puntatore alla funzione statica viene sempre valutato come true in questo contesto, quindi il valore che viene stampato.

std::cout<< stu::no << std::endl; stampa l'indirizzo della funzione, in realtà non lo stai chiamando.

 std::cout<< stu::no() << std::endl; 

chiama la funzione e stampa il valore di ritorno.

In MSVS, questo produce effettivamente un valore puntatore, con l' operator << (void*) overload operator << (void*) .

Usa stu :: no () invece di stu :: no. Inoltre, una cosa minore in realtà ma se lo metti

usando lo spazio dei nomi std;

al di sotto del #include non dovrai usare std ::

Rende le cose un po ‘più leggibili.

stu::no è una funzione che non accetta argomenti e restituisce int.

Non c’è operator<< che funzioni con la propria firma specifica, quindi vengono considerati i sovraccarichi disponibili. Per operator<<(ostream&, bool) breve, l' operator<<(ostream&, bool) è la corrispondenza più operator<<(ostream&, bool) , dopo le conversioni da funzione a puntatore e da puntatore a bool.

Poiché la funzione esiste effettivamente, il suo indirizzo è decisamente diverso da zero, quindi il puntatore alla conversione bool restituisce sempre true , che viene visualizzato come 1 .

Rendilo std::cout<< std::boolalpha << stu::no << std::endl; per vedere di persona che è davvero un'uscita booleana.

Rendilo std::cout<< stu::no() << std::endl; per stampare il risultato della chiamata di funzione.

Vedi Come stampare i puntatori di funzione con cout? se vuoi sapere cosa è successo più in dettaglio.