2016-02-17 166 views
0

我有一个测试即将到来,我想澄清两个有关参数的问题。输入,输出,输入/输出参数

在我的笔记它指出一个参数传递给函数的推荐方式是使用“在”参数

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

还可选优化状态,我们可以通过“按引用传递”通过值,我们也可以通过引用传递out变量而不是简单的返回值。

根据审查的问题,我要回答它指出

假设所有类型为“中等”尺寸:不要使用小值优化或大价值优化。

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

更进一步,存在着问创建一个原型函数(无体),其具有以下一个问题:

IN:字符串,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

我敢说,具有相同名称的变量是一个疏忽 – Tas

+0

所以这将是评论包中的拼写错误? –

回答

1

由于您仍然在学习传递值的基本知识,因此我不会涉及不可变类型或任何其他低级语言语义,因此我会尽可能直接回答您的问题,并让您向您的教师咨询有关这些主题的更多信息(以及希望不会让你感到困惑的测试)。

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

基于你现在正在学习的情况下,我会说没有说,它的指的尺寸为sizeof(X)其中X是你在通过输入/输出类型。所以在int的情况下,做一个传递价值或者一个传递引用对内存或CPU时间没有真正的额外费用,但如果我有这样的事情如下:

struct SomeLargeStruct { 
    char SomeChars[1000]; 
    int SomeInts[1000]; 
    double SomeDoubles[1000]; 
}; 

sizeof(SomeLargeStruct)将是相当大的,并招致了大量的施工时间,如果我们传递的价值(因为会发生的复印件),例如:

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 

因此,对于“中的”类型的,你给const type&陈述到传入的值的代码的用户必须是有效的引用(即它不能为空),因为它是const合格的,我们可以放心,参考我们类型的代码不会/不能修改数据,即它是只读的。

“输出”类型为type&,因为这表示中传递的值可能会被函数修改为。如果type是一个很大的类型(即sizeof)类型,并且返回类型中包含任何临时对象,则执行此操作与返回操作的成本可能会更低,否则可能没有太大区别(您必须检查低级别大会肯定)。

至于“IN/OUT”的类型,你可以再次使用type&来表示该值可以进行修改,但有传言称我已经看到了“IN/OUT”种类更多的通常被称为“可选”类型,也就是说,“输入/输出”类型可以是一个可选参数,如果没有任何参数传入,则该参数具有默认值,否则传入的值会有影响,因此可以修改

可能修饰符为“out”和“in/out”类型,因为它将留给函数的实现者来记录值可能会改变的事实,换句话说,这是可能的他们忘记在type&之前放置const

鉴于此,按你与问候原型的其他问题,我打赌了OUT : double dIN/OUT : string d是一个错字,否则,你总是可以只写2个函数原型:

double foo (const string& a, const C& b, string& d); 
double d = foo(x, y, z); // double d ?? 

和/或

void foo(const string& a, const C& b, double& d, string& s) 
{ 
    cout << "IN/OUT string d maybe string s?" << endl; 
} 

但是为了安全起见,你应该用你的老师大概仔细检查(毕竟,你可能不会是唯一一个与可能的错字挣扎)。

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

+1

@ 5gon12eder,touché:)我编辑删除,谢谢! – txtechhelp