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;} 为什么它会发生?我如何解决它??

4

4 回答 4

7

将其更改为std::cout<< stu::no() << std::endl;

没有(),我相信它是作为指针进行评估,而不是按照您的期望进行。

编辑:正如@Loomchild 所指出的, usingg++ -Wall将提供关于为什么它总是 1 的进一步见解。指向静态函数的指针总是true在这个上下文中被评估,因此被打印的值。

于 2012-10-24T13:51:28.060 回答
2

std::cout<< stu::no << std::endl;打印函数的地址,你实际上并没有调用它。

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

调用函数并打印返回值。

在 MSVS 中,这确实会产生一个指针值,并带有重载operator << (void*)

于 2012-10-24T13:51:53.933 回答
1

使用 stu::no() 代替 stu::no。此外,真的是一件小事,但如果你把

使用命名空间标准;

在#includes 下面你不必使用std::

只是让事情更具可读性。

于 2012-10-24T14:01:27.913 回答
0

stu::no是一个不带参数并返回 int 的函数。

没有operator<<具有您特定签名的函数,因此考虑了可用的重载。长话短说,operator<<(ostream&, bool)在函数到指针和指针到布尔转换之后,这是最接近的匹配。

由于函数实际存在,它的地址肯定是非零的,所以指向 bool 转换的指针总是产生true,你看到的就是1

让它std::cout<< std::boolalpha << stu::no << std::endl;自己看看它确实是一个布尔输出。

让它std::cout<< stu::no() << std::endl;打印函数调用的结果。

请参阅如何使用 cout 打印函数指针?如果您想更详细地了解发生了什么。

于 2012-10-24T13:52:00.103 回答