以下代码编译并运行但我不确定在较低级别上究竟发生了什么。引用是否只存储被引用对象的地址?如果是这样,两个测试函数都接收一个地址作为参数?或者C ++实现是否能够以其他方式区分这些类型?
int main() {
int i = 1;
cout << test(i) << endl;
}
char test(int &i) {
return 'a';
}
char test(int *i) {
return 'b';
}
答案 0 :(得分:7)
由于int&
和int*
是不同的类型而i
可以被视为int&
但不能被视为int*
,因此重载决议在此绝对明确无误
此时引用只是一种有点隐形的指针并不重要。从语言的角度来看,它们是不同的类型。
答案 1 :(得分:2)
C ++中的引用更像是别名而不是指针。引用本身不是一个单独的变量,但它是现有变量的新“名称”。在您的示例中,第一个测试将被调用,因为您将整数传递给函数。指针是一个单独的变量,它保存另一个变量的地址,因此对于要调用的第二个函数,您必须使用指针调用test。像这样.. test(&i);
虽然让运营商和运营商感到困惑。获取变量的地址,而变量是用&amp;像int &i
一样声明一个引用。
答案 2 :(得分:1)
您的代码只与char test(int&i)
匹配,因为您将int&
传递给该函数且无法转换为int*