Почему это работает? Я не могу понять логи c этого обмена - PullRequest
1 голос
/ 02 мая 2020
int main() {
    // Complete the program
    string a,b;
    getline(cin,a);
    getline(cin,b);
    cout<<a.size()<<" ";
    cout<<b.size();
    string c=a+b;
    cout<<endl<<c;

    swap(a[0],b[0]);
    cout<<endl<<a<<" "<<b;
    return 0;
}
void swap(string s1,string s2){
    string temp=s1;
    s1=s2;
    s2=temp;
}

Итак, цель состоит в том, чтобы поменять местами первый элемент обеих строк, но я создал для этого общую функцию и даже понял ее правильно. Но неожиданно я не использовал проход по ссылке или по указателю! Даже в этом случае изменения являются постоянными, когда я пытаюсь вывести a и b в конце!

Логически это не должно работать, но оно работает. Это как-то связано со строками?

1 Ответ

5 голосов
/ 02 мая 2020

Это почти наверняка связано с тем, что где-то в коде, который вы нам не показали, у вас есть эта строка (или что-то очень похожее):

using namespace std;

Если эта строка включена, то Само namespace std определяет функцию следующим образом:

void swap(_Ty& _Left, _Ty& _Right);

Где шаблон _Ty заменяется на char в вашем вызове swap(a[0],b[0]);.

Добавить простое cout << "My Swap" << endl; введите вашу swap функцию, и вы увидите, что она не вызывается.

Настоятельно рекомендуется прочитать: Почему "используется пространство имен std;" считается плохой практикой? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...