2012-10-24 25 views
1

所以我有一段代碼對於這樣的一個等級:C++靜態方法輸出使用COUT始終爲1

#include<iostream> 
#include<cstring> 

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; 
} 

的輸出爲1。 它這樣做,即使我改變stu::no,以便它只有{return 12;} 爲什麼會發生?我如何解決它??

+2

這是一個錯字,因爲stu :: no是一個函數,它應該打印一些看起來像指針的東西。你的意思是std :: cout << stu :: no()<< std :: endl; ? – CashCow

回答

7

將其更改爲std::cout<< stu::no() << std::endl;

沒有(),我相信它的評估作爲一個指針,而不是做你期待什麼。

編輯:由於@Loomchild指出的那樣,使用g++ -Wall將提供進一步的深入瞭解,爲什麼它總是1.指針的靜態函數總是在此上下文中評價爲true,正在打印因此值。

+3

'g ++ -Wall'會警告以下內容:'警告:'static int stu :: no()'的地址總會被評估爲'true'' – Loomchild

+0

@Loomchild:啊,這就解釋了它。 –

+0

哦,我可以看到,你可以給我任何提示我怎麼能沒有額外的「()」,我的意思是不改變主? – user1267757

2

std::cout<< stu::no << std::endl;打印該函數的地址,而不是實際調用它。

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

調用函數並打印返回值。

在MSVS中,這確實會產生一個指針值,其中過載爲operator << (void*)

0

stu::no是一個不帶參數並返回int的函數。

沒有operator<<將函數與您的特定簽名一起使用,因此將考慮可用的過載。長話短說,operator<<(ostream&, bool)是在函數指針和指針到bool轉換之後最接近的匹配項。

由於該函數實際存在,其地址絕對非零,所以指向bool轉換的指針總是產生true,您將其看作1

使它std::cout<< std::boolalpha << stu::no << std::endl;親眼看到它確實是一個布爾輸出。

使它std::cout<< stu::no() << std::endl;打印函數調用的結果。

請參閱How to print function pointers with cout?如果您想知道更詳細的情況。

1

使用stu :: no()而不是stu :: no。 此外,一個小事情真的,但如果你把

using namespace std;

你將不必使用std ::

#包括以下只是使事情變得更具有可讀性。