【问题标题】:c++ static method output using cout is always 1使用 cout 的 c++ 静态方法输出始终为 1
【发布时间】:2012-10-14 13:54:00
【问题描述】:

所以我有一段类似这样的类的代码:

#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;},它也会这样做 为什么会这样?我该如何解决??

【问题讨论】:

  • 这是一个错字,因为 stu::no 是一个函数,它应该打印一些看起来像指针的东西。你的意思是 std::cout

标签: c++ methods static


【解决方案1】:

改成std::cout&lt;&lt; stu::no() &lt;&lt; std::endl;

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

编辑:正如@Loomchild 所指出的,使用g++ -Wall 将进一步了解为什么它总是1。在这种情况下,指向静态函数的指针总是被评估为true,因此值被打印出来。

【讨论】:

  • g++ -Wall 发出以下警告:warning: the address of 'static int stu::no()' will always evaluate as 'true'
  • @Loomchild:啊,这就解释了。
  • 哦,我明白了,你能给我任何提示吗?我的意思是在不改变 main 的情况下如何做到这一点?
  • @user1267757:不是真的。如果你想让main() 调用一个函数,你必须使用函数调用语法,这包括将() 放在函数名之后。任何解决方法仍然需要更改 main 以使其调用函数。
  • 哦,我知道了,我只是将“proba”的名称改为“no”,然后删除了以前的“no”
【解决方案2】:

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

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

调用函数并打印返回值。

在 MSVS 中,这确实会产生一个指针值,重载 operator &lt;&lt; (void*)

【讨论】:

    【解决方案3】:

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

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

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

    将其设为std::cout&lt;&lt; std::boolalpha &lt;&lt; stu::no &lt;&lt; std::endl;,以亲眼看看它确实是一个布尔输出。

    将其设为std::cout&lt;&lt; stu::no() &lt;&lt; std::endl; 以打印函数调用的结果。

    如果您想更详细地了解发生了什么,请参阅How to print function pointers with cout?

    【讨论】:

      【解决方案4】:

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

      使用命名空间标准;

      在#includes 下方,您不必使用std::

      只是让内容更具可读性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-09
        • 2010-12-17
        • 2012-09-01
        • 2020-07-01
        • 1970-01-01
        • 2011-12-30
        相关资源
        最近更新 更多