将结构传递给函数时,原型/标题会是什么样子?将结构成员传递给函数时它们会是什么样子?
例如......
struct a_struct{
int a;
int b;
};
a_struct point;
void f1(a_struct)
void f2(a_struct)
让我说我想将整个结构传递给f1,但只是f2的成员。我会使用数据类型a_struct作为参数吗?或者f2会有不同的数据类型,因为我只传递一个int成员。对于一系列结构,这会有所不同吗?我负责编写的程序应该使用结构数组。我认为这不会产生太大的影响,除非它会自动通过引用传递。
答案 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)
要f1
取a_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,请使用指针。