【发布时间】:2012-04-25 17:54:24
【问题描述】:
我正在学习C++的参考,我尝试了以下来自Thinking in C++的代码:
但是,我发现如果我没有将引用转换为 'long' 类型,那么 f 和 g 的引用是相同的,我认为这不会'没有意义,它们的值都是 1 而不是以十六进制显示的数字,有人可以解释一下吗?
谢谢。
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
【问题讨论】:
-
这些不是引用,而是函数的地址。
-
这可能是
bool的隐式转换,尝试在流中设置布尔 alpha 标志,看看它们是否更改为true而不是1。 -
函数指针没有
ostream::operator<<()重载,但void*有。&j将匹配void*重载(这就是为什么这似乎有效),但函数指针不会 - 他们得到的最佳匹配是bool的匹配。 -
它们的值都是 1 而不是十六进制...十六进制只是表示数字的另一种方式。就像十进制(以 10 为底)、二进制(以 2 为底)和十六进制(以 16 为底)一样。
标签: c++ memory pointers reference