我刚学C++,以及从C来,一些函数调用我看到这本书让我困惑:C++函数取值,他们应该采取引用
char a;
cin.get(a);
在C,这不可能工作,如果你这样做,将无法获得输出,因为你是通过价值传递,而不是通过引用,为什么这在C++中工作?引用和取消引用使得隐式(编译器知道cin.get需要一个指针,所以它被引用)?
我刚学C++,以及从C来,一些函数调用我看到这本书让我困惑:C++函数取值,他们应该采取引用
char a;
cin.get(a);
在C,这不可能工作,如果你这样做,将无法获得输出,因为你是通过价值传递,而不是通过引用,为什么这在C++中工作?引用和取消引用使得隐式(编译器知道cin.get需要一个指针,所以它被引用)?
C++
这将用C工作++因为get()
函数签名可能是这样的:
void get(char& a); // pass-by-reference
的&
符号0123后表示编译器比当您传递值为char
时,它应该将引用传递给char
而不是复制它。
这实质上意味着在get()
内所做的任何更改都将反映在方法之外的值a
中。
如果get()
函数签名是这样的:
void get(char a); // pass-by-value
然后a
将由值,这意味着a
副本被传递被传递到方法作为参数之前进行。对a
所做的任何更改只会是本地方法,并在方法返回时丢失。
Ç
之所以这将不是在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++允许通过引用传递(注意&
,这表示一个参考时):
void foo(char& bar) {
bar = 42;
}
int main() {
char a;
foo(a);
// a == 42 here
}
这就是为什么一些C++程序员不喜欢用这样的引用。
它看起来像一个函数的争论 - 你不知道'a'是否被修改的语法。
首选传递const引用(当你有一个大的对象和一个副本会很昂贵),并返回引用或最好的传递指针。
-1,因为通过参数返回是完全有效和良好的风格(和有经验的C++程序员,包括标准委员会)。 – Tronic 2010-02-24 04:37:25
@Martin - 当一个方法需要返回多个值时,这不起作用。 – LeopardSkinPillBoxHat 2010-02-24 04:40:47
返回引用可能会引起麻烦,因为调用方无法控制返回引用引用的对象的生存期。特别是,如果你返回一个堆栈对象的引用,你的调用者将会有很多悲伤:) – 2010-02-24 04:42:14
C没有引用,只有值。 C++有实际的引用,别名到另一个实例。 – GManNickG 2010-02-24 04:19:37
然后,一元&运算符的名称是什么?我认为这是参考运营商。 – 2010-02-24 04:25:52
&in C表示“地址”。在C++中,&意味着“地址”(如果在变量前面使用)或“引用”(如果在参数中键入后使用)。 – LeopardSkinPillBoxHat 2010-02-24 04:39:37