C ++函数采用值,它们应该在哪里引用

时间:2010-02-24 04:15:58

标签: c++ pointers reference pass-by-reference pass-by-value

我只是在学习c ++,而且来自c,我在书中看到的一些函数调用让我很困惑:

char a;
cin.get(a);

在C中,这可能不会起作用,如果你这样做,就没有办法获得输出,因为你是通过值传递而不是通过引用,为什么这在c ++中工作?引用和去除是隐式的(编译器知道cin.get需要一个指针,所以它被引用)?

4 个答案:

答案 0 :(得分:11)

<强> C ++

这可以在C ++中使用,因为get()的函数签名可能是这样的:

void get(char& a); // pass-by-reference

&之后的char符号表示编译器,而不是传递char值时,它应该将引用传递给{{ 1}}而不是复制它。

这实质上意味着char内所做的任何更改都会反映在方法之外的get()值中。

如果a的函数签名是这样的:

get()

然后void get(char a); // pass-by-value 将通过 value 传递,这意味着在作为参数传递给方法之前会生成a的副本。对a的任何更改都只是本地方法,并在方法返回时丢失。

<强> C

这在C中不起作用的原因是因为C只有传递值。在C中模拟 pass-by-reference 行为的唯一方法是按值传递其指针,然后在修改其中的值时取消引用指针值(从而访问相同的内存位置)方法:

a

运行此程序将输出:

void get(char* a)
{
    *a = 'g';
}

int main(int argc, char* argv[])
{
    char a = 'f';
    get(&a);
    printf("%c\n", a);

    return 0;
}

答案 1 :(得分:4)

引用类型的工作方式(通过引用传递,而不是按值传递)。它类似于在C中传递指针(通过指针传递),但具有更好的语法和更安全(编译时检查)。实现在内部通过指针传递。

答案 2 :(得分:1)

C ++允许按引用传递(注意&,表示使用了引用):

void foo(char& bar) {
    bar = 42;
}

int main() {
    char a;
    foo(a);
    // a == 42 here
}

答案 3 :(得分:1)

这就是为什么有些C ++程序员不喜欢使用这样的引用。
它看起来像一个函数争论 - 你不知道'a'是否被修改的语法。

首选传递const引用(当你有一个大对象和一个副本会很昂贵)并返回引用或最好的传递指针。