2011-05-30 51 views
1

下面的代码编译并运行,但我不确定下一层究竟发生了什么。没有引用只是存储被引用对象的地址?如果是这样,两个测试功能都将接收地址作为参数?还是C++实现能够以其他方式区分这些类型?函数重载在以下情况下如何工作?

int main() { 
    int i = 1; 
    cout << test(i) << endl; 
} 

char test(int &i) { 
    return 'a'; 
} 

char test(int *i) { 
    return 'b'; 
} 

回答

7

作为int&int*是不同的类型和i可以被视为一个int&但不是作为int*,重载分辨率在这里绝对是毫不含糊的。

在这一点上,引用仅仅是一种有点隐形的指针并不重要。从语言的角度来看,它们是不同的类型。

+0

好吧,这让事情变得清晰 – 2011-05-30 19:49:58

1

因为要传递一个int&给函数你代码只与char test(int&i)匹配,并且不能被转换到int*

2

C++中的引用更类似于指针的别名。引用本身并不是一个单独的变量,但它是现有变量的新“名称”。在你的例子中,第一个测试会被调用,因为你正在向函数传递一个整数。指针是一个单独的变量,它保存着另一个变量的地址,因此第二个被调用的函数必须用指针调用测试。像这样.. test(&i);虽然有点混淆运营商&获取变量的地址,而用&如int &i声明的变量声明参考。

相关问题