在下面的代码中,为什么交换函数以两种方式工作,通过将值传递为swap(x,y)和swap(& x,& y)。
int main(){
int x, y;
cout << "Enter the values of x and y: ";
cin >> x >> y;
swap(x, y);
cout << "\nSwapped values are, x: " << x << " & y: " << y <<"\n";
return 0;
}
void swap(int *a, int *b){
int s;
s = *a;
*a = *b;
*b = s;
}
答案 0 :(得分:7)
您在撰写std::swap
swap(x, y);
在您的示例中,即使您编写swap(&x, &y);
,除非在void swap(int*,int*);
之前声明main
,否则只会出现编译错误。
std::swap
对此无效,因为它无法将右值int*
转换为int*&
。 (即使它可以做到这一点,它也不会交换x
和y
的值)
答案 1 :(得分:6)
以下是另一个答案的解释,关于调用std::swap
的原因:
当您swap(x, y)
时,编译器会尝试查找要调用的swap
重载。假设您已编写using std::swap;
或using namespace std;
,则允许编译器查看的名称空间为全局名称空间std
。
原型void swap(int, int)
是预期的,但编译器对选项开放 - 具有相同名称,相同计数参数但需要强制的不同参数类型的函数也可以 - 当寻找可行的重载时;在枚举它们之后,它会选择最接近的匹配。
您在全局命名空间中实现的类型为
void swap(int*, int*);
但standard library header <utility>
给出的是函数模板
namespace std {
template <typename T>
void swap(T&, T&);
}
此重载从void swap(int&, int&)
开始变为T = int
。现在这是一个身份匹配(不需要类型强制),因此赢得重载决议。
如果您没有编写using std::swap;
或using namespace std;
,那么编译器可用的唯一可能的重载就是您的,您可能会遇到错误,说明参数类型不匹配。修复它将修复调用代码以传递int*
(这些变量的地址是int
的类型指针)而不是int
:
swap(&x, &y);
答案 2 :(得分:2)
当您调用版本swap(x,y)时,它实际上调用了标准库函数模板&#34;模板void swap(T&amp; a,T&amp; b)&#34; ,在&#34;算法&#34;中声明头文件。