【问题标题】:Passing structures and structure members to functions将结构和结构成员传递给函数
【发布时间】:2012-11-29 11:05:26
【问题描述】:

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

例如...

struct a_struct{
int a;
int b;
};

a_struct point;

void f1(a_struct)
void f2(a_struct)

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

【问题讨论】:

  • 我有一本书,并且已经彻底浏览了它并在网上搜索了它。这本书概述了结构的基本用法,它没有明确谈论它们是如何传递给函数的。虽然我在网上找到了其中的一些,但我对传递结构数组一无所知。
  • structures 是普通类型和普通参数。一旦您了解了基础知识以及如何使用函数及其参数,您就会找到问题的答案。你不能就这样穿过这本书。

标签: c++ arrays structure members


【解决方案1】:

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

您可能的声明可能是:

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];

【讨论】:

  • 我在这里修复了明显的语法错误:struct 是一个关键字,所以你不能将它用作标识符。
【解决方案2】:

对于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 的函数,或者将整个数组传入(也带有大小参数),然后在函数内部循环。 IE。你会这样做:

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()end() 成员函数)。

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

【讨论】:

  • 感谢您的及时回复。这是我想出来的。如果我传递数组中的特定位置,比如我有并且我想使用循环将所有对象逐个传递给函数... a_struct object[5]; f1(object[], i) 或像 f1(object[i]) 一样传递
【解决方案3】:

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

return_type fn_name(object_name)

当您想传递其中一个成员时,在这种情况下假设为 a

return_type fn_name(int)

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

【讨论】:

    【解决方案4】:

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

    但它适用于按值调用。如果你想使用调用被引用使用指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-06
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      相关资源
      最近更新 更多