我对C ++比较陌生,并且很难将我的数组传递给一个单独的函数。抱怨重新问一个毫无疑问已被回答十几次的问题,但我找不到任何与我的代码问题类似的问题。
int main()
{
Array<int> intarray(10);
int grow_size = 0;
intarray[0] = 42;
intarray[1] = 12;
intarray[9] = 88;
intarray.Resize(intarray.Size()+2);
intarray.Insert(10, 6);
addToArray(intarray);
int i = intarray[0];
for (i=0;i<intarray.Size();i++)
cout<<i<<'\t'<<intarray[i]<<endl;
Sleep(5000);
}
void addToArray(Array<int> intarray)
{
int newValue;
int newIndex;
cout<<"What do you want to add to the array?"<<endl;
cin >> newValue;
cout<<"At what point should this value be added?"<<endl;
cin >> newIndex;
intarray.Insert(newValue, newIndex);
}
答案 0 :(得分:5)
您正在传递数组的副本,因此任何更改都不会影响原始数据。通过引用传递:
void addToArray(Array<int> &intarray)
// ^
答案 1 :(得分:2)
这是关于参数传递的更一般问题的特例。
您可能需要考虑以下准则:
如果你想将一些东西传递给一个函数来修改它在函数内部(并使更改对调用者可见),通过引用传递(的 &
强>)。
e.g。
// 'a' and 'b' are modified inside function's body,
// and the modifications should be visible to the caller.
//
// ---> Pass 'a' and 'b' by reference (&)
//
void Swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
如果您想将便宜的东西(例如int
,double
等)传递给的函数在函数内部观察,你可以简单地传递值。
e.g。
// 'side' is an input parameter, "observed" by the function.
// Moreover, it's cheap to copy, so pass by value.
//
inline double AreaOfSquare(double side)
{
return side*side;
}
如果您想将不便宜的东西(例如std::string
,std::vector
等)传递给的函数在函数内部观察(不修改它),你可以通过const引用( const &
)。
e.g。
// 'data' is an input parameter, "observed" by the function.
// It is in general not cheap to copy (the vector can store
// hundreds or thousands of values), so pass by const reference.
//
double AverageOfValues(const std::vector<double> & data)
{
if (data.empty())
throw std::invalid_argument("Data vector is empty.");
double sum = data[0];
for (size_t i = 1; i < data.size(); ++i)
sum += data[i];
return sum / data.size();
}
在现代C ++ 11/14中还有一个额外的规则(与移动语义相关):如果你想传递便宜的东西来移动并制作本地副本,然后按值传递,std::move
从值传递。
e.g。
// 'std::vector' is cheap to move, and the function needs a local copy of it.
// So: pass by value, and std::move from the value.
//
std::vector<double> Negate(std::vector<double> v)
{
std::vector<double> result( std::move(v) );
for (auto & x : result)
x *= -1;
return result;
}
由于您在addToArray()
函数中修改了Array<int>
参数,并且希望修改对调用者可见,因此您可以应用规则#1,并且传递通过引用(&
):
void addToArray(Array<int> & intarray)