2011-05-07 66 views
10

我有以下代码:这个程序为什么交换这些值?

#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)

+0

基本上有些解决,这是http://stackoverflow.com/questions/2712076/how-to的欺骗-use-iterator-in-c/2712125#2712125,虽然你不知道这个,除非你知道答案。 – sbi 2011-05-08 06:14:30

回答

37

swap功能不会被调用的。

其中一个标准库包含您正在使用的<utility>,它在std名称空间中声明名为swap的函数模板。由于你是using namespace std;,因此swap函数被引入到全局名称空间中,并且它被调用。


为什么std::swap选择,而不是你swap功能?您的swap函数按值取两个long;要调用该函数,每个int参数都需要整数提升。

std::swap是一个函数模板。它需要两个引用T,并且该函数模板使用T = int实例化时,两个参数都是完全匹配的。所以,std::swap比你的功能更好的匹配,因此在超载分辨率时选择它。


这是using namespace std;是邪恶的,应该避免的原因之一。如果你删除了使用指令,你的函数将是唯一可用的函数,它将被调用。

+7

你可以调用你swap():: swap(x,y) – 2011-05-07 05:25:40

+3

Tricky。非常棘手。 – Maxpm 2011-05-07 05:28:14

1

long而不是int

您当前的代码已经与swap有更好的匹配,因此它可以避免隐式转换为long,而是使用STL中内置的swap

在一个侧面说明,这种模糊性是在语言中使用overload sets(也here)D.