我刚刚学习 c++,并且来自 c,我在书中看到的一些函数调用让我感到困惑:
char a;
cin.get(a);
在 C 中,这不可能工作,如果你这样做,将无法获得输出,因为你是按值传递,而不是按引用传递,为什么这在 c++ 中有效?引用和取消引用是隐式的(编译器知道 cin.get 需要一个指针,所以它被引用了)?
我刚刚学习 c++,并且来自 c,我在书中看到的一些函数调用让我感到困惑:
char a;
cin.get(a);
在 C 中,这不可能工作,如果你这样做,将无法获得输出,因为你是按值传递,而不是按引用传递,为什么这在 c++ 中有效?引用和取消引用是隐式的(编译器知道 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
thena
将通过valuea
传递,这意味着在作为参数传递给方法之前制作了一个副本。对的任何更改a
都只会是方法的本地更改,并且在方法返回时会丢失。
C
这在 C 中不起作用的原因是因为 C 只有pass-by-value。在 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++ 程序员不喜欢使用这样的引用。
它看起来像一个函数争论 - 你从语法中不知道“a”是否被修改。
更喜欢传递 const 引用(当您有一个大对象并且副本会很昂贵时)并返回引用或最好的所有传递指针。