为什么这样做?我无法理解这种交换的逻辑

Why is this working? I cannot understand the logic of this swapping

提问人:Gaganrajdeep Singh 提问时间:5/3/2020 最后编辑:Adrian MoleGaganrajdeep Singh 更新时间:5/3/2020 访问量:115

问:

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 时,这些更改是永久性的!

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

C++ 字符串 按引用传递

评论

2赞 Jesper Juhl 5/3/2020
注意:std::swap 存在。
0赞 PaulMcKenzie 5/3/2020
发布所有代码,包括标头包含的内容,而不是代码段。有一个函数,而且很可能是被调用的函数。std::swap
0赞 Anonymous1847 5/3/2020
您能告诉我们您对 a 和 b 使用了哪个输入吗?我同意,这不应该起作用......
2赞 Sam Varshavchik 5/3/2020
你知道我有心灵感应吗?我碰巧知道你在代码的开头,即使你没有展示它。我应该去算命......using namespace std;
1赞 Blastfurnace 5/3/2020
a[0]并且是单独的参考。它不是调用接受字符串的函数。b[0]char

答:

8赞 Adrian Mole 5/3/2020 #1

这几乎可以肯定是由于这样一个事实,即在您没有向我们展示的代码中的某个地方,您有这一行(或非常相似的内容):

using namespace std;

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

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

模板在调用中替换的位置。_Tycharswap(a[0],b[0]);

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

强烈推荐阅读:为什么“使用命名空间 std;”被认为是不好的做法?

评论

0赞 Gaganrajdeep Singh 5/3/2020
非常感谢,我明白了!但即使我以自己的方式定义掉期;正在使用命名空间的功能!
0赞 Adrian Mole 5/3/2020
是的 - 编译器将找到与您的调用“最佳匹配”,这不是您提供的调用。替换为 like 行,然后编译器会给你一个错误,指出功能调用是错误的。using namespace std;using std::cout; using std::cin; using std::endl; using std::string;
0赞 Gaganrajdeep Singh 5/3/2020
如果我删除命名空间 std;它实际上应该有效,因为这样最好的匹配将是我定义的函数;不是吗?
0赞 eesiraed 5/3/2020
@GaganrajdeepSingh 否,因为您的函数在为其提供单个字符时接受字符串。
1赞 eesiraed 5/3/2020
@GaganrajdeepSingh 没有从单个字符到单个字符的转换,尽管一些重载运算符用于接受单个字符。std::stringstd::string