将动态数组对象传递给函数

3

我正在学习C++,所以了解一种通过将参数传递给函数并像按值调用一样工作,但实际上是按引用调用的方法。例如:

void myFUNC(string& x)

现在,我有一个动态创建的对象数组。我想将该数组传递给像上面那样的方法函数。下面是代码段:

City *p = new City[number]; // pointer to dynamic array of class objects

//function prototype
void list_cities(int number, City p[]){
    for(int i=0; i<number; i++){
        cout<<p[i].get_name()<<endl;
    }
}

如何将动态数组传递到函数中,就像上面的方法一样。 - Fahad Rana
list_cities(number, p); - Jarod42
1
顺便说一下,更喜欢使用 std::vector - Jarod42
有什么更简单的方法吗?只需要帮我将动态数组发送到函数中。 - Fahad Rana
@FahadRana:你是什么意思?没有比 list_cities(number, p) 更容易的了。 - Mike Seymour
3个回答

2

令人困惑的是,看起来像数组的函数参数 City p[] 实际上是一个指针,相当于 City * p。因此,您可以直接传递指向动态数组的指针:

list_cities(number, p);

话虽如此,还是更喜欢友好类型,比如std::vector<City>,这样就不必操心指针和小心避免内存泄漏等问题了。


1

数组默认转换为指针,然后作为引用传递。因此,没有明确地按引用传递数组的规定。也就是说,

void list_cities(int number, City &p[])

这里并不是将 p[] 作为引用传递,而是将 p[] 变成了一个引用数组。

代码:

void list_cities(int number, City p[])
{
    for(int i=0; i<number; i++)
    {
        cout<<p[i].get_name()<<endl;
    }
}

int main()
{
    City *p = new City[number];
    list_cities(number,p);
    delete[] p;
}

点击这里来到此处,数组不会通过引用传递,会执行数组到指针转换。在这种情况下,甚至不存在数组,只有一个指针。 - Passer By

1
使用std::vector,您也可以执行以下操作:
void list_cities(std::vector<City> &cities)
{
    for (size_t iCity = 0; iCity < cities.size(); iCity++){
        cout << cities[iCity].get_name() << endl;
    }
}

std::vector<City> cities;
// fill list here
list_cities(cities);

1
我对向量一无所知,它们可能会解决问题,但其他答案已经解决了这个问题。 - Fahad Rana
你肯定应该阅读一下。它是 C++ 标准模板库中的一个容器,基本上是动态数组的一个非常薄的包装器。但与动态数组不同的是,它提供了基本函数(例如插入或删除元素),并可以为您处理数组的大小。 - Satara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接