我有以下代码:
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <conio.h>
#include <cstring>
#include <iomanip>
void swap(long a, long b)
{
long temp;
temp=a;
a=b;
b=temp;
}
int _tmain(int argc, _TCHAR* argv[])
{
int x = 5, y = 3;
cout << x ;
cout << y << endl;
swap(x, y);
cout << x ;
cout << y << endl;
getch();
return 0;
}
程序给出输出:
5 3
3 5
程序实际上交换了值!这是为什么? swap()
的参数不是指针或引用。
(我使用的是 VS 2005)
最佳答案
你的 swap
函数根本没有被调用。
您包含的其中一个标准库正在拉入 <utility>
, 它声明了一个名为 swap
的函数模板在std
命名空间。既然你是using namespace std;
, 那swap
函数被带入全局命名空间并被调用。
为什么是std::swap
选择而不是你的 swap
功能?你的swap
函数需要两个 long
按值(value)计算;要调用该函数,每个 int
都需要整数提升争论。
std::swap
是一个函数模板。它需要两次引用 T
,并且当该函数模板被实例化时 T = int
,两个参数完全匹配。所以,std::swap
比您的函数更匹配,因此在重载解析期间选择它。
这是 using namespace std;
的原因之一是邪恶的,应该避免。如果删除 using 指令,您的函数将是唯一可用的函数,并且会被调用。
关于c++ - 为什么这个程序要交换值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5919300/