1

将结构传递给函数时,原型/标头会是什么样子?将结构的成员传递给函数时它们会是什么样子?

例如...

struct a_struct{
int a;
int b;
};

a_struct point;

void f1(a_struct)
void f2(a_struct)

假设我想将整个结构传递给 f1,但只是传递给 f2 的成员。我会使用数据类型 a_struct 作为两者的参数吗?或者 f2 会有不同的数据类型,因为我只传递了一个 int 成员。这对于结构数组会有所不同吗?我受命编写的程序应该使用结构数组。我认为这不会有太大的不同,只是它会自动通过引用传递。

4

4 回答 4

8

当传递对象(不仅仅是标量值)时,您必须关注内存所有权和复制等。这意味着您可以选择多种方式来声明函数的接口。例如,您可以按引用传递或按值传递。

您可能的声明可能是:

void f1(a_struct& my_struct);

这将传递对 a_struct 对象的引用并防止对该对象的任何复制。但是,您的示例结构仅包含标量值,因此复制对象的可能性不会引起太多担心。结果,这就足够了:

void f1(a_struct my_struct);

就将结构的成员传递给函数而言,需要将函数声明为采用成员的类型。例如,要将 a_struct 的 a 成员传递给函数,您可以:

void f1(int val);

最后,数组确实使事情变得复杂,因为它们会作为指向函数的指针出现。例如,要传递一个 a_struct 对象数组,您可以进行以下声明:

void f1(a_struct* my_struct);

但是,您可以简单地正常引用该参数。例如:

my_structs[1];
于 2012-11-29T11:10:07.780 回答
3

f1获取a_struct,这取决于您是否希望能够在f1. void f1(a_struct s);可以正常工作,并制作副本。void f1(const a_struct & s);需要一个参考,但你不能改变它(无论如何都没有麻烦)。我尽量避免非const参考。

如果你f2想拿一个int,你写void f2(int);。它不关心它int来自哪里(即在 a 内部struct或单独)。然后像这样称呼它f2(point.b);

使用数组的函数可能很麻烦,这取决于你想用它做什么。最简单的方法是记住数组退化为指针。

void f3 (a_struct * const structArray)
{ /* Do something */ }
a_struct myArray[10];
f3(myArray);

还有其他(更好的)方法可以做到这一点。

编辑:如果您想将函数应用于数组的每个元素,有(表面上)两种方法(如果您考虑一下,实际上只是一种方法)。循环遍历数组,并将每个元素传递给一个接受 的函数a_struct,或者将整个数组传入(也带有 size 参数),然后在函数内部循环。即你会这样做:

a_struct myArray[10];
for (int i = 0; i < 10; ++i)
{
    f1( myArray[i] );
}

// Or, better, from <algorithm>
std::for_each(myArray, myArray+10, f1);

请注意,这不是越界访问。只要从不取消引用,就可以保证允许在数组末尾创建一个指针(恰好对于这些循环情况)。

当然,这一切都假设您确实需要一个数组,而不是 a std::vector(在这种情况下,循环看起来基本相同,除了您将使用begin()andend()成员函数)。

实际上,如果您有权访问,则c++11可以使用std::begin()and ,这对于s 或数组的std::end()工作方式完全相同。vector

于 2012-11-29T11:11:32.670 回答
0

当你想传递一个结构(或一个类)时:

return_type fn_name(object_name)

当你想通过它的一个成员时,假设a在这种情况下。

return_type fn_name(int)

此外,除非我弄错了,否则所有函数参数都默认按值传递,除非您明确指定。如果您需要传递数组,那么它的语法将与任何其他类型相同。

于 2012-11-29T11:09:21.743 回答
0

如果您只想传递成员函数的值,请发送其类型,例如将 a_struct 的“a”作为参数的函数应该是 void func(int a);

但它适用于按值调用。如果您想使用调用作为参考,请使用指针。

于 2012-11-29T11:09:56.190 回答