问题描述
|
以下代码可以编译并运行,但是我不确定较低级别上到底发生了什么。引用不只是存储被引用对象的地址吗?如果是这样,两个测试功能都将接收地址作为参数吗?还是C ++实现能够以其他方式区分这些类型?
int main() {
int i = 1;
cout << test(i) << endl;
}
char test(int &i) {
return \'a\';
}
char test(int *i) {
return \'b\';
}
解决方法
由于
int&
和int*
是不同的类型,而i
可以被视为int&
,而不是int*
,因此这里的过载解析绝对是明确的。
在这一点上,引用只是某种隐蔽的指针并不重要。从语言的角度来看,它们是不同的类型。
, C ++中的引用更类似于别名而不是指针。引用本身不是单独的变量,但是它是现有变量的新“名称”。在您的示例中,第一个测试将被调用,因为您正在将整数传递给该函数。指针是一个单独的变量,其中包含另一个变量的地址,因此要调用第二个函数,您将必须使用指针来调用test。像这样..test(&i);
有点混淆运算符&来获取变量的地址,而用&像int &i
声明的变量则声明了引用。
, 您的代码仅与char test(int&i)
匹配,因为您将int&
传递给函数,并且不能转换为int*