-1

C++ のリファレンスについて学習していて、Thinking in C++ から次のコードを試しました。

ただし、「long」型への参照をキャストしなかった場合、fgの参照は同じであることがわかりました。これは意味がないと思います。それらの値は、表示される数値ではなく両方とも1です。 16進数、誰か説明できますか?

ありがとう。

include <iostream>
using namespace std;
int dog, cat, bird, fish;

void f(int pet) {
    cout << "pet id number:" << pet << endl;
}
void g(int pet) {
    cout << "pet id number:" << pet << endl;
}
int main() {
    int i,j, k;

    cout << "f() normal: " << &f << endl;
    cout << "f() long: " << (long)&f << endl;
    cout << "g() normal: " << &g << endl;
    cout << "g() long: " << (long)&g << endl;  
    cout << "j normal: " << &j << endl;  
    cout << "j long: " << (long)&j << endl;
    cout << "k: " << (long)&k << endl;

    k=2;
    cout << "k: " << (long)&k << endl;  
} // 

結果

f() normal: 1
f() long: 4375104512
g() normal: 1
g() long: 4375104608
j normal: 0x7fff6486b9c0
j long: 140734879939008
k: 140734879939004
k: 140734879939004
4

2 に答える 2

3

forostreamのオーバーロードがあり、任意のデータポインターを にキャストできるため、のようなアドレスが出力されます。ただし、関数ポインタは に変換できないため、この特定のオーバーロードは邪魔になりません。operator<<void*void*intjvoid*

そのとき、別のoperator<<オーバーロードが発生します。この場合、それは のオーバーロードになりboolます。bool関数ポインターは(true == ポインターが NULL でない場合)に変換できます。へのポインターfは非 NULL であるため、この変換では true になり、1 として出力されます。

于 2012-04-25T18:05:50.827 に答える
1

これは参照とは何の関係もありません。そのプログラムは参照を使用しません。address-of演算子を使用しています&https://stackoverflow.com/a/9637342/365496を参照してください

f() normal: 1              the address of f is converted to bool 'true' and printed 
f() long: 4375104512       the address of f is converted to an integer
g() normal: 1              the address of g is converted to bool 'true' and printed
g() long: 4375104608       the address of g is converted to an integer
j normal: 0x7fff6486b9c0   the address of j is printed directly (there's an operator<< for this but not one for printing function pointers like f and g)
j long: 140734879939008    the address of j is converted to an integer
k: 140734879939004         the address of k is converted to an integer
k: 140734879939004         the address of k is converted to an integer
于 2012-04-25T18:03:00.917 に答える