2011-05-07 64 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.