所以我有这样一类的一段代码:
#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;}
为什么会发生? 我如何解决它??
将其更改为std::cout<< stu::no() << std::endl;
如果没有()
我相信它的评估作为一个指针,而不是做你期待什么。
编辑:正如由@Loomchild指出的那样,使用g++ -Wall
将提供进一步的深入了解,为什么它总是1.指针的静态功能总是评价为true
在此背景下,正在打印因此值。
std::cout<< stu::no << std::endl;
打印功能的地址,你不实际调用它。
std::cout<< stu::no() << std::endl;
调用函数并打印返回值。
在MSVS,这确实会产生一个指针值,与过载operator << (void*)
使用STU ::没有()代替STU ::没有。 此外,未成年人的事情真的,但如果你把
使用命名空间std;
#包括下面你将不必使用std ::
只是使事情变得更具有可读性。
stu::no
是一个函数,它没有参数,返回int类型。
没有operator<<
与您的特定签名需要的功能,所以可用过载被考虑。 长话短说,在operator<<(ostream&, bool)
是最接近的匹配,在函数到指针和指针到布尔转换。
由于该功能确实存在,它的地址是绝对不为零,所以指针布尔转换总是会产生true
,你看到的1
。
让它std::cout<< std::boolalpha << stu::no << std::endl;
看到自己,这真的是一个布尔输出。
让它std::cout<< stu::no() << std::endl;
打印函数调用的结果。
请参阅如何打印函数指针与COUT? 如果您想了解更详细的事了。