In,Out,In / Out参数

时间:2016-02-17 04:51:15

标签: c++ parameters parameter-passing

我有一个测试,我想对有关参数的两个问题做一些澄清。

在我的笔记中,它指出将参数传递给函数的推荐方法是使用“按引用传递”

    const type& x; // for "in" parameters
    type& x; // for "out"(to read) and "in/out"(to read/write) parameters

它还说明了可选的优化,我们可以按值传递“in”参数,我们也可以通过引用传递out变量而不是简单的返回。

在评论问题上,我试图回答它说明

  

假设所有类型都是“中等”大小:不要使用小值优化或大值优化。

对“中等大小”的引用是否意味着我会使用“in”和“in / out”参数的引用传递以及使用“out”值的基本返回值?

此外,还有一个问题要求创建具有以下内容的原型函数(无主体):

  

IN:字符串a,C b
  OUT:双d
  IN / OUT:字符串d

    double foo (const string& a, const C& b, string& d)

是我现在所拥有的,但我不知道如何处理OUT和IN / OUT,因为它们具有相同的名称。我是否正确地假设对字符串的引用可以传递给函数,并且像stod()这样的函数用于生成double类型的返回,它可以存储在调用函数中,如

    double val = foo(x,y,z)

1 个答案:

答案 0 :(得分:1)

我不会进入不可变类型或任何其他低级语言语义,因为您仍然在学习传递价值的基础知识,因此我会尽可能直接地回答您的问题。留给你,让你的导师询问有关这些主题的更多信息(以及希望不要让你混淆测试)。

  

引用"中等大小"意思是我会在""中使用参考传递。和"进/出"参数以及使用" out"的基本回报;值?

根据您现在正在学习的内容,我会说它所引用的大小是sizeof(X)其中{{ 1}}是你传入/传出的类型。因此,在X的实例中,执行值传递或传递引用对内存或CPU时间没有实际的额外成本,但如果我有类似以下内容:

int

如果我们按值传递(因为会发生复制),struct SomeLargeStruct { char SomeChars[1000]; int SomeInts[1000]; double SomeDoubles[1000]; }; 会相当大并且会产生很长的构建时间,例如:

sizeof(SomeLargeStruct)

所以" in"类型,你给void incurACopy(SomeLargeStruct s) { /* do something with s */ } void giveMeDirect(SomeLargeStruct& s) { /* do something with s */ } SomeLargeStruct c; incurACopy(c); // a copy of c is made, lots of data being passed giveMeDirect(c); // the location of c is passed on the stack, no copy made 声明代码的用户传入的值必须是有效的引用(即它不能为null),因为它const type&合格,我们可以放心,参考我们类型的代码不会修改数据,也就是说,它是只读的。

" out" type为const,因为这表示该函数可以修改中传递的值。如果type&是一个大型(即type)类型并且返回类型中涉及任何临时值,则执行此操作与返回可能成本较低,否则可能没有太大差异(您和#39; d必须检查低级装配。)

至于"进/出"类型,您可以再次使用sizeof来表示值可以被修改,尽管我已经看过"进/出"类型更常被称为"可选"类型,即"输入/输出" type可以是一个可选参数,如果没有传入,则具有默认值,否则传入的值具有效果,因此可以进行修改。

" out" 可以修饰符和"进/出"类型是存在的,因为它会留给函数的实现者来记录值可能会改变的事实,换句话说,它们可能只是忘记将type&放在{{1}之前1}}。

考虑到这一点,根据您对原型的其他问题,我谨慎地说consttype&是一个错字,否则,您总是可以写出2个函数原型:

OUT : double d

和/或

IN/OUT : string d

但为了安全起见,你应该仔细检查一下你的导师(毕竟,你可能不是唯一一个正在努力解决这个问题的人)。

希望能帮助你,并祝你的考试好运。