前向脱位改变功能行为?

巴萨

我正在学习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 ++会按值传递,除非您在函数参数前使用安号(&),如下所示:

function swap(int &a, int &b) {
来自莫斯科的弗拉德

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

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

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

using namepsace std;

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

当存在函数的前向声明时,编译器会选择函数,因为它与非模板函数最匹配。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

奇怪的窗口功能行为

来自分类Dev

Android拆分功能行为

来自分类Dev

带有匿名功能的功能行为

来自分类Dev

“ foreach”导致我的功能行为异常

来自分类Dev

ZSH功能行为?(运行C ++)

来自分类Dev

C ++未执行的代码更改功能行为?

来自分类Dev

R中意外的套用功能行为

来自分类Dev

如何专门化(重载)单个类型的功能行为?

来自分类Dev

C ++未执行的代码更改功能行为?

来自分类Dev

更新到Swift 3后奇怪的转义功能行为

来自分类Dev

PL / SQL过程DBMS_OBFUSCATION_TOOLKIT.MD5的异常功能行为

来自分类Dev

写终极版减速器和行动同样的功能行为

来自分类Dev

predsort / 3的可能行为

来自分类Dev

熊猫行功能行迭代

来自分类Dev

功能LLVM的前向声明

来自分类Dev

SQL:奇怪的查询性能行为

来自分类Dev

Java BigDecimal奇怪的性能行为

来自分类Dev

SQL:奇怪的查询性能行为

来自分类Dev

前向兼容接口的功能签名更改

来自分类Dev

前向兼容接口的功能签名更改

来自分类Dev

使用OpenGL和GLSL的SSAO算法的奇怪性能行为

来自分类Dev

CPU缓存的这种性能行为的说明

来自分类Dev

.NET字典插入的怪异性能行为

来自分类Dev

改变开关位置行为

来自分类Dev

改变功能改变变量

来自分类Dev

计算不仅仅包含注释的功能行

来自分类Dev

保存前向控制器添加功能

来自分类Dev

改变功能范围

来自分类Dev

单独改变超级键的行为