C ++函数取值,他们应该采取引用
-
22-09-2019 - |
题
我刚学C ++,以及从C来,一些函数调用我看到这本书让我困惑:
char a;
cin.get(a);
在C,这不可能的工作,如果你这样做,就没有办法得到输出,因为你是按值传递,而不是通过引用,为什么这项工作在C ++?被引用和dereferncing由隐式的(编译器知道cin.get需要一个指针,所以它被引用)?
解决方案
<强> C ++ 强>
此将用C ++工作因为get()
函数签名可能是这样的:
void get(char& a); // pass-by-reference
&
表示给编译器当你在char
值传递比后char
符号,它应该通过在参考到char
而不是使它的一个副本。
这本质上意味着get()
之内,所作的任何更改将在a
的方法以外的值中反映出来。
如果对于get()
函数签名是这样的:
void get(char a); // pass-by-value
然后a
将由值传递,这意味着a
的副本被传递到方法作为参数之前进行。然后a
任何改变将仅本地的方法,并且失去了当该方法返回。
<强> C 强>
之所以这在C不会工作是因为C只有通过按值。效仿的唯一途径的通过按引用用C行为是通过值传递它的指针,然后去参考指针值(从而访问同一存储器位置)修饰内的值时方法:
void get(char* a)
{
*a = 'g';
}
int main(int argc, char* argv[])
{
char a = 'f';
get(&a);
printf("%c\n", a);
return 0;
}
运行该程序将输出:
g
其他提示
参考工作类型这样的(通过引用传递,而不是由值传递)。这是类似于C传递指针(通由指针),但具有更好的语法和更安全(编译时检查)。实施经过指针内部。
C ++允许通过引用通(注意&
,即一个参考使用哪个表示):
void foo(char& bar) {
bar = 42;
}
int main() {
char a;
foo(a);
// a == 42 here
}
这就是为什么一些C ++程序员不喜欢那样使用引用。结果 它看起来像一个函数arguement - 你有没有从语法线索是否“一”被修改或不
不想传递常数引用(当您有大量对象和一个拷贝将是昂贵的)以及返回的引用或最好全部传递指针的。
不隶属于 StackOverflow