首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正解密改变功能行为?

正解密改变功能行为?
EN

Stack Overflow用户
提问于 2015-03-16 22:01:50
回答 2查看 51关注 0票数 1

我正在学习C++,发现了一些我想要理解的奇怪的东西(参见代码第5行的注释):

代码语言:javascript
运行
复制
#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++按值传递,除非您在函数参数前面使用安培(&),如下所示:

代码语言:javascript
运行
复制
function swap(int &a, int &b) {
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-16 22:20:18

首先,交换函数不交换原始参数。它交换退出函数后将销毁的原始参数的副本。如果希望函数确实交换原始参数,则必须将参数声明为引用。

代码语言:javascript
运行
复制
void swap(int &a, int &b) {
    int tmp = a;
    a = b;
    b = tmp;
}

当程序中没有函数的前向声明时,编译器似乎选择了交换原始参数的标准函数std::swap。由于使用指令,标准函数std::swap由编译器考虑。

代码语言:javascript
运行
复制
using namepsace std;

如果删除它并删除函数的前向声明,则编译器将发出错误。

当函数的前向声明出现时,编译器将选择您的函数,因为它是与非模板函数最匹配的函数。

票数 2
EN

Stack Overflow用户

发布于 2015-03-16 22:05:42

swap的实现在本地交换函数中的值,因为它的参数是通过值传递的。它不会改变调用函数中的任何内容。

当您没有函数声明时,就使用std::swap,这样做是正确的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29087765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档