2015-03-16 1 views
1

J'apprends C++ et vient de trouver quelque chose d'étrange que je voudrais comprendre (voir le commentaire sur la 5ème ligne du code):La déclenchement vers l'avant modifie le comportement de la fonction?

#include <iostream> 

using namespace std; 

// WITH this forward decleration the output is A=1 and B=2 
// WITHOUT this forward decleration the output is A=2 and B=1 
// WHY?? 
void swap(int a, int b); 

int main() { 

    int a = 1; 
    int b = 2; 

    swap(a, b); 

    cout << "A: " << a << endl; 
    cout << "B: " << b << endl; 

    system("PAUSE"); 

    return 0; 
} 

void swap(int a, int b) { 
    int tmp = a; 
    a = b; 
    b = tmp; 
} 

Quelqu'un peut-il expliquer ce comportement s'il vous plaît? Je pensais que, par défaut C++ passe par valeur à moins que vous utilisez le amperstand (&) devant le paramètre de fonction comme ceci:

function swap(int &a, int &b) { 
+1

Et si vous supprimez à la fois la directive using et la directive using, elle échoue à se compiler, comme vous vous en doutez. – chris

+0

@chris Pas vraiment, il y a 'std :: swap' qui implémente le bon swap (contrairement au sien). – 0x499602D2

+1

@ 0x499602D2, Oui, je sais. [Voici ce que je veux dire] (http://coliru.stacked-crooked.com/a/e5f34aaf54dfd956). – chris

Répondre

2

Tout d'abord, votre fonction de permutation n'échange pas les arguments d'origine. Il échange les copies des arguments d'origine qui seront détruites après avoir quitté la fonction. Si vous voulez que la fonction serait en effet échanger des arguments originaux alors les paramètres doivent être déclarés comme referemces

void swap(int &a, int &b) { 
    int tmp = a; 
    a = b; 
    b = tmp; 
} 

Quand il n'y a pas de déclaration avant de votre fonction dans le programme, alors il semble que le compilateur sélectionne la fonction norme std::swap que swaps arguments originaux. La fonction standard std::swap est considéré par le compilateur en raison de la directive à l'aide

using namepsace std; 

Si vous supprimez et supprimez la déclaration avant de votre fonction le compilateur émettra une erreur. Lorsque la déclaration directe de votre fonction est présente, le compilateur sélectionne votre fonction car c'est la meilleure correspondance en tant que fonction hors modèle.

+0

À peu près la même réponse que R Sahu mais avec plus d'informations. Merci! – Basaa

4

Votre mise en œuvre de swap permute les valeurs localement dans la fonction puisque ses arguments sont passés par valeur. Cela ne change rien dans la fonction d'appel.

Lorsque vous n'avez pas cette déclaration de fonction, std::swap est utilisé, ce qui fait la bonne chose.

+0

Incroyable. Merci! – Basaa