为什么这是有效的?我无法理解这种交换的逻辑

Gag*_*ngh 1 c++ string pass-by-reference pass-by-value

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;
}
Run Code Online (Sandbox Code Playgroud)
void swap(string s1,string s2){
    string temp=s1;
    s1=s2;
    s2=temp;
}
Run Code Online (Sandbox Code Playgroud)

嗯,目标是交换两个字符串的第一个元素,但我为此创建了一个通用函数,甚至做对了。但是,出乎意料的是,我没有使用按引用或指针传递!即便如此,当我最终尝试输出 a 和 b 时,这些更改是永久性的!

从逻辑上讲,它不应该起作用,但它正在起作用。跟弦有关系吗?

Adr*_*ica 8

这几乎可以肯定是因为在您没有向我们展示的代码中的某处,您有以下行(或非常相似的内容):

using namespace std;
Run Code Online (Sandbox Code Playgroud)

包括这一行,那么它非常namespace std定义一个函数,如下所示:

void swap(_Ty& _Left, _Ty& _Right);
Run Code Online (Sandbox Code Playgroud)

当_Ty模板替换char您的swap(a[0],b[0]);通话。

cout << "My Swap" << endl;向您的 swap函数添加一条简单的行,您将看到它没有被调用。

强烈推荐阅读:为什么是“using namespace std;” 被认为是不好的做法?.