由于您仍然在学习传递值的基本知识,因此我不会涉及不可变类型或任何其他低级语言语义,因此我会尽可能直接回答您的问题,并让您向您的教师咨询有关这些主题的更多信息(以及希望不会让你感到困惑的测试)。
对“中等大小”的引用是否意味着我将为“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 d
和IN/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;
}
但是为了安全起见,你应该用你的老师大概仔细检查(毕竟,你可能不会是唯一一个与可能的错字挣扎)。
希望能帮助你,并祝你好运。
我敢说,具有相同名称的变量是一个疏忽 – Tas
所以这将是评论包中的拼写错误? –