2015-03-16 3 views
1

Я учусь C++ и только что-то странное, что я хотел бы понять (см комментарий на 5-й строке кода):Вперед.

#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; 
} 

Может кто-нибудь объяснить это поведение пожалуйста? Я думал, что по умолчанию C++ проходит по значению, если вы не используете amperstand (&) перед параметром функции, как это:

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

И если вы удалите как это, так и директиву использования, он не скомпилируется, как вы ожидали. – chris

+0

@chris На самом деле нет 'std :: swap', который реализует правильный обмен (в отличие от его). – 0x499602D2

+1

@ 0x499602D2, Да, я знаю. [Вот что я имею в виду] (http://coliru.stacked-crooked.com/a/e5f34aaf54dfd956). – chris

ответ

2

Прежде всего, ваша функция подкачки не заменяет исходные аргументы. Он заменяет копии исходных аргументов, которые будут уничтожены после выхода из функции. Если вы хотите, чтобы функция будет действительно поменять оригинальные аргументы, то параметры должны быть объявлены как referemces

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

Когда нет опережающего объявления о вашей функции в программе, то, кажется, компилятор выбирает стандартную функцию std::swap, что свопы оригинальные аргументы. Стандартная функция std::swap рассматривается компилятором в связи с использованием директивы

using namepsace std; 

Если вы удалите его и удалите опережающее объявление вашей функции, то компилятор выдаст сообщение об ошибке.

Когда присутствует прямое объявление вашей функции, компилятор выбирает вашу функцию, потому что она наилучшим образом соответствует функции без шаблона.

+0

Практически тот же ответ, что и R Sahu, но с дополнительной информацией. Благодаря! – Basaa

4

Ваша реализация swap обменивает значения локально в функции, поскольку ее аргументы передаются по стоимость. Это ничего не меняет в вызывающей функции.

Если у вас нет этого объявления функции, используется std::swap, что делает правильную вещь.

+0

Amazing. Благодаря! – Basaa

Смежные вопросы