通过引用传递对象数组

时间:2015-07-19 08:44:34

标签: c++

我是C ++的新手,我无法找到有关如何传递对象数组作为参考的解释。当我定期传递它时,它只更新功能范围内的值,不像C#,它通过引用自动传递。 谢谢。

3 个答案:

答案 0 :(得分:2)

如果你没有实际的数组,例如

Server Side
ViewBag.decimalplace = "2"; //this may vary 2 or 3  according to currencies

Client Side
@{ var regex = string.Format(@"^\d+,\d{{0,{0}}}$", ViewBag.decimalplace); }
@Html.TextBoxFor(model => model.SourceCurrencyValue, 
new { data_val_regex_pattern = regex, data_val_regex = "Error message" })

然后当你将它传递给一个函数时会衰减到一个指针,所以在某种程度上它已经通过引用传递了。这个函数像数组一样声明参数并不重要,它仍然是一个指针。

因此以下两个函数声明是等效的:

MyClass array[X];

void my_function(MyClass array[X]);

如果你有一个动态分配的数组,比如例如

void my_function(MyClass* array);

然后MyClass* array = new MyClass[X]; 已经是一个指针,不需要通过引用传递,除非要修改实际的指针。

如果你有一个std::vectorstd::array类型的对象(我推荐使用指针或普通数组),那么你可以使用普通的&符号array通过引用传递它。

答案 1 :(得分:2)

您可以通过引用传递原始数组,即使语法有点难看:

#include <iostream>

void ModifyArray(int (&array)[5])
{
    array[4] = 0;
}

int main()
{
    int array[5] = { 1, 2, 3, 4, 5 };

    ModifyArray(array);

    std::cout << array[4] << "\n";
}

使用std::array使语法更简单:

#include <iostream>
#include <array>

void ModifyArray(std::array<int, 5>& array)
{
    array[4] = 0;
}

int main()
{
    std::array<int, 5> array = { 1, 2, 3, 4, 5 };

    ModifyArray(array);

    std::cout << array[4] << "\n";
}

如果你试图直接传递一个原始数组&#34;然后你真的将一个指针传递给数组的第一个元素。这被非正式地称为&#34;衰变&#34;。以下显然有效,但有一点需要注意:

#include <iostream>

void ModifyArray(int array[5]) // works?
{
    array[4] = 0;
}

int main()
{
    int array[5] = { 1, 2, 3, 4, 5 };

    ModifyArray(array);

    std::cout << array[4] << "\n";
}

需要注意的是,参数的大小信息,即[5]部分,将被忽略。因为,正如我们刚刚建立的那样,该函数不会使用数组而是指针。

尝试以下方法:

#include <iostream>

void ModifyArray(int array[5]) // works?
{
    array[4] = 0; // problem!
}

int main()
{
    int array[3] = { 1, 2, 3 };

    ModifyArray(array);
}

此程序编译正常但调用未定义的行为,因为您尝试访问3元素数组的第5个元素。它没有什么不同:

#include <iostream>

void ModifyArray(int* array)
{
    array[4] = 0; // problem!
}

int main()
{
    int array[3] = { 1, 2, 3 };

    ModifyArray(array);
}

当您传递元素集合时,默认情况下始终使用std::vectorstd::array,如果您真的需要它们,请考虑替代方案。

答案 2 :(得分:1)

通过引用传递数组通常是不必要的。向函数声明数组参数时,它与将参数声明为指针相同,因此无论如何都要有间接级别。

当您传递std::vectorstd::array之类的对象时,您可以像参考名称之前的&那样通过引用传递它,就像任何旧参数一样。

这是一个通过引用将向量传递给函数并观察为调用者更改包含值的示例:

#include <vector>
#include <iostream>

void double_all(std::vector<int>& values) {
  for (int& v: values)
    v += v;
}

int main() {
  std::vector<int> values = {0, 1, 2, 3, 4};
  double_all(values);
  for (int v: values)
    std::cout << v << "\n";
}