将结构和结构成员传递给函数

时间:2012-11-29 11:05:27

标签: c++ arrays structure members

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

例如......

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 个答案:

答案 0 :(得分:8)

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

可能的声明可能是:

void f1(a_struct& my_struct);

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

void f1(a_struct my_struct);

至于将结构的一个成员传递给一个函数,需要声明该函数采用该成员的类型。例如,要将a_struct的成员传递给函数,您可以执行以下操作:

void f1(int val);

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

void f1(a_struct* my_struct);

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

my_structs[1];

答案 1 :(得分:3)

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

如果您希望f2选择int,请撰写void f2(int);。它并不关心int来自何处(即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);

请注意,这是超出界限的访问权限。您可以保证允许在数组末尾创建一个指针一个(完全针对这些循环情况),只要它永远不会被解除引用。

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

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

答案 2 :(得分:0)

如果要传递结构(或类):

return_type fn_name(object_name)

如果您想传递其中一个成员,请在这种情况下说a

return_type fn_name(int)

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

答案 3 :(得分:0)

如果要传递一个成员函数的值,则发送其类型 例如,将a_struct的'a'作为参数的函数应该是     void func(int a);

但它适用于按值调用。如果你想使用call be reference,请使用指针。