C++函数的默认参数是如何传递的?

Xia*_*hen 3 c++ parameter-passing

说我有以下代码:

#include <iostream>

using namespace std;

int defaultvalue[] = {1,2};
int fun(int * arg = defaultvalue)
{
    arg[0] += 1;
    return arg[0];
}

int main()
{
   cout << fun() << endl;
   cout << fun() << endl;

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果是:

2
3
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为指针*arg操纵数组defaultvalue.但是,如果我将代码更改为:

#include <iostream>

using namespace std;

int defaultvalue[] = {1,2};

int fun(int arg[] = defaultvalue)
{
    arg[0] += 1;
    return arg[0];
}

int main()
{
   cout << fun() << endl;
   cout << fun() << endl;

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

但结果仍然是:

2
3
Run Code Online (Sandbox Code Playgroud)

而且,当我打印出defaultvalue:

cout << defaultvalue[0] <<endl;
Run Code Online (Sandbox Code Playgroud)

结果是3.

我的问题是,在第二个例子中,函数参数是否应该通过值传递,以便更改arg将不会影响defaultvalue?

Lig*_*ica 12

我的问题是,在第二个例子中,函数参数是否应该通过值传递,以便arg的更改对defaultvalue没有影响?

没有.

按值传递数组是不可能的(非常感谢,C!)因此,作为"妥协"(读取:设计失败),int[]在函数参数列表中实际意味着int*.所以你的两个程序完全相同.甚至写int[5]或int[24]或int[999]实际上将意味着int*.荒谬,不是吗?!

在C++中,我们更喜欢std::array用于数组:它是一个数组包装类,它具有适当的对象语义,包括可复制.您可以通过值将它们传递给函数.

实际上,std::array主要是为了使这些愚蠢和令人惊讶的本机数组语义过时的目的而引入.

  • C程序员注意事项:通过使用数组成员定义结构,可以在C中获得与`std :: array`相同的效果; 然后,您可以通过值传递该结构类型. (2认同)