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 で指摘されているように、使用g++ -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() を使用します。また、本当に些細なことですが、

名前空間 std を使用します。

#include の下では、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 に答える