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主要是为了使这些愚蠢和令人惊讶的本机数组语义过时的目的而引入.